Как перебрать множество массивов?

Добрый день. Есть много массивов с данными и обьект, который принимает их в качестве параметров. Чтобы обработать все параметры приходится писать кучу foreach. Выглядит громоздко, и когда нужно добавить какой-то параметр или убрать, это становится проблемно.
foreach
foreach
foreach
foreach
Понимаете?
  • Вопрос задан
  • 2441 просмотр
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Как-то так:
/**
 * Generate all the possible combinations among a set of nested arrays.
 * @author fabiocicerchia
 * @homepage https://gist.github.com/fabiocicerchia/4556892
 *
 * @param array $data  The entrypoint array container.
 * @param array $all   The final container (used internally).
 * @param array $group The sub container (used internally).
 * @param mixed $val   The value to append (used internally).
 * @param int   $i     The key index (used internally).
 */
function generate_combinations(array $data, array &$all = array(), array $group = array(), $value = null, $i = 0)
{
    $keys = array_keys($data);
    if (isset($value) === true) {
        array_push($group, $value);
    }

    if ($i >= count($data)) {
        array_push($all, $group);
    } else {
        $currentKey     = $keys[$i];
        $currentElement = $data[$currentKey];
        foreach ($currentElement as $val) {
            generate_combinations($data, $all, $group, $val, $i + 1);
        }
    }

    return $all;
}

$params = array(
	'param1' => array(1,2,3),
	'param2' => array(1,2,3),
	'param3' => array(1,2,3)
);

foreach (array_values(generate_combinations($params)) as $args) {
    $object = new Object($args[0], $args[1], $args[2]);
}


Но лучше реализовать рекурсивный итератор.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@daMage Автор вопроса
$params = array(
	'param1' => array(1,2,3),
	'param2' => array(1,2,3),
	'param3' => array(1,2,3)
);

foreach($params['param1'] as $param1) {
	foreach($params['param2'] as $param2) {
		foreach($params['param3'] as $param3) {
			$object = new Object($param1, $param2, $param3);
		}
	}
}
Ответ написан
akubintsev
@akubintsev
Опытный backend разработчик
Есть множество функций PHP для работы с массивами. Без конкретной задачи проблематично что-либо оптимизировать.
Напишите метод, который сконвертирует из массивов подходящий набор аргументов для объекта.
Пока из того, что я увидел, возник вопрос: зачем передавать в конструктор объекта эти параметры?
Почему нельзя использовать условно $object->setParam1($param1), $object->setParam2($param2), $object->setParam3($param3)?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы