Все комбинации ассоциативного массива в строке шаблона в PHP?

#php #arrays #string #replace

#php #массивы #строка #заменить

Вопрос:

У меня есть этот вариант использования, когда мне нужно записать все комбинации массива в заданную строку шаблона.

то есть:

 // can have as many identifier keys 'A', 'B', 'C', etc
$arr = [
    'A' => [
        // can have as many replacement values
        'A1',
        'A2'
    ],
    'B' => [
        'B1',
        'B2'
    ]

];
$template = 'A B A';
// returns an array of strings like output below
$genStrings = generateStrings($arr, $template); 
// Output
// A1 B1 A1
// A1 B1 A2
// A2 B1 A1
// A2 B1 A2
// A1 B2 A1
// A1 B2 A2
// A2 B2 A1
// A2 B2 A2
  

Есть какой-нибудь индикатор? Пытался выполнить это всю прошлую ночь, безуспешно.

Спасибо!

Комментарии:

1. Вы должны развернуть шаблон и выполнить цикл… Пожалуйста, опубликуйте свои попытки…

2. Я готов помочь вам с возможным решением, но, действительно, пожалуйста, сначала поделитесь своими попытками. Может быть, вы не так уж далеки от истины и есть способ провести вас через это.

3. Вариант использования намного сложнее, чем просто развертывание шаблона, я пытаюсь запутать селекторы css, учитывая замены для каждого элемента в селекторе (этот элемент является ключом в этом $ arr, а замены — это значения), тогда решение потребует замены шаблона, хотя я уже добился здесь некоторого прогресса. Причина, по которой я спрашиваю об этом здесь, заключается в том, чтобы выяснить минимальную логику, необходимую мне для генерации строк. Я уже читал кое-что о наборах мощности, и, похоже, это правильный путь.

Ответ №1:

Я бы использовал рекурсивную функцию, которая объединяет все возможные значения для первого элемента со всеми возможными перестановками для остальных.

Примечание: Код PHP 7.4, но при необходимости его можно легко сделать совместимым с предыдущими версиями.

 /**
 * @param mixed[] $inputArray
 * @param int[]|string[] $template
 * @return mixed[][]
 */
function computePermutations(array $inputArray, array $template): array
{
  $permutations = [];
  $lastPass = count($template) === 1;

  foreach ($inputArray[$template[0]] as $firstPermutation) {
    if ($lastPass) {
      $permutations[] = [$firstPermutation];
    }
    else {
      foreach (computePermutations($inputArray, array_slice($template, 1)) as $restPermutation) {
        $permutations[] = [$firstPermutation, ...$restPermutation];
      }
    }
  }

  return $permutations;
}
  

Использование:

 $permutations = computePermutations($arr, explode(' ', $template));
$permutationsAsStrings = array_map(fn($permutation) => implode(' ', $permutation), $permutations);

print_r($permutationsAsStrings);
  

ДЕМОНСТРАЦИЯ

Комментарии:

1. Для меня это хорошая отправная точка, я попробую расширить это решение до тех пор, пока шаблон не станет чем-то вроде «A.abc B # io A # 123». На самом деле мне бы понравилось что-то вроде: $permutations = computePermutations($arr, «A.abc B # io A # 123»), и это вернуло бы всю строку [] выходных данных. Я все же отмечу вас как принятые и поработаю над этим 🙂 спасибо! 🙂

2. Я мог бы помочь вам с этим, но не уверен, что правильно понимаю: что представляют эти .abc и #io вещи? Вам пришлось бы привести примеры. Вы также могли бы опубликовать это как новый вопрос (и связать его здесь).