Я пытаюсь собрать два массива вместе, и результаты остаются неправильными. Я покажу вам свой код, результаты, которые я получаю, и результаты, которые я ищу.
Наверное, я просто делаю это неправильно, но не знаю, как это сделать.
Мой код:
$data1 = [ 'a: 1', 'a: 2', 'a: 3', 'a: 4', 'a: 5' ]; $data2 = [ 'b: 1', 'b: 2', 'b: 3', 'b: 4', 'b: 5' ]; foreach($data1 as $item1) { foreach($data2 as $item2) { echo $item1 . '<br/>'; echo $item2 . '<br/>'; echo '<br/><br/>'; } }
Результаты: (сокращено для экономии места)
a: 1 b: 1 a: 1 b: 2 a: 1 b: 3 a: 1 b: 4 a: 1 b: 5
Результаты, которые я ищу, следующие:
a: 1 b: 1 a: 2 b: 2 a: 3 b: 3 a: 4 b: 4 a: 5 b: 5
Ну, конечно, проблема, конечно, в вашей вложенной петле foreach. Поскольку для каждого элемента вашего массива $data1 вы выполняете цикл всего массива $data2 (так что в целом есть $data1 * $data2 итерации).
Чтобы решить эту проблему, вам необходимо сразу пропустить оба массива.
array_map() (PHP> = 5.3) Вы можете сделать это с помощью array_map() и передать все массивы, которые вы хотите пропустить в одно и то же время.
array_map(function($v1, $v2){ echo $v1 . "<br>"; echo $v2 . "<br><br>"; }, $data1, $data2 /* , Add more arrays if needed manually */);наarray_map(function($v1, $v2){ echo $v1 . "<br>"; echo $v2 . "<br><br>"; }, $data1, $data2 /* , Add more arrays if needed manually */);
Примечание. Если количество элементов неравномерно, вы не будете генерировать никаких ошибок, оно просто напечатает NULL (значит, вы ничего не увидите)
MultipleIterator (PHP> = 5.3) Используйте MultipleIterator и прикрепите столько ArrayIterator сколько вам нужно.
$it = new MultipleIterator(); $it->attachIterator(new ArrayIterator($data1)); $it->attachIterator(new ArrayIterator($data2)); //Add more arrays if needed foreach($it as $a) { echo $a[0] . "<br>"; echo $a[1] . "<br><br>"; }на$it = new MultipleIterator(); $it->attachIterator(new ArrayIterator($data1)); $it->attachIterator(new ArrayIterator($data2)); //Add more arrays if needed foreach($it as $a) { echo $a[0] . "<br>"; echo $a[1] . "<br><br>"; }
Примечание. Если количество элементов неравномерно, оно просто напечатает все значения, в которых оба массива все еще имеют значения
for loop метода for loop (PHP> = 4.3) Используйте цикл for с переменной счетчика, которую вы можете использовать как ключ для обоих массивов.
$keysOne = array_keys($data1); $keysTwo = array_keys($data2); $min = min(count($data1), count($data2)); for($i = 0; $i < $min; $i++) { echo $data1[$keysOne[$i]] . "<br>"; echo $data2[$keysTwo[$i]] . "<br><br>"; }на$keysOne = array_keys($data1); $keysTwo = array_keys($data2); $min = min(count($data1), count($data2)); for($i = 0; $i < $min; $i++) { echo $data1[$keysOne[$i]] . "<br>"; echo $data2[$keysTwo[$i]] . "<br><br>"; }
Примечание. Использование array_keys() заключается в том, что это также работает, если массивы не имеют одинаковых ключей или являются ассоциативными. min() используется только для того, чтобы прорезать столько элементов, сколько каждый массив имеет
array_combine() (PHP> = 5.0) Или, если массивы имеют только уникальные значения, вы можете array_combine() оба массива, так что $data1 можно получить как ключ, а $data2 как значение.
foreach(array_combine($data1, $data2) as $d1 => $d2) { echo $d1 . "<br>"; echo $d2 . "<br><br>"; }наforeach(array_combine($data1, $data2) as $d1 => $d2) { echo $d1 . "<br>"; echo $d2 . "<br><br>"; }
Примечание . Массивы должны иметь одинаковое количество элементов, иначе array_combine() выдает ошибку
call_user_func_array() (PHP> = 5.6) Если вы хотите одновременно напечатать более двух массивов или просто неизвестное количество массивов, вы можете объединить метод array_map() с call_user_func_array() .
$func = function(...$numbers){ foreach($numbers as $v) echo $v . "<br>"; echo "<br>"; }; call_user_func_array("array_map", [$func, $data1, $data2]);
Примечание. Поскольку этот метод kinda использует метод array_map() , он ведет себя одинаково с неравномерным количеством элементов. Кроме того, поскольку этот метод работает только для PHP> = 5.6, вы можете просто удалить аргументы и изменить $numbers с помощью func_get_args() в цикле foreach, а затем он также работает для PHP> = 5.3
используйте ключ от 1, чтобы получить строку в 2
foreach($data1 as $k=> $item1) { echo $item1 . '<br/>'; echo $data2[$k] . '<br/>'; echo '<br/><br/>'; }