#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
вещи? Вам пришлось бы привести примеры. Вы также могли бы опубликовать это как новый вопрос (и связать его здесь).