Как я могу пропустить два массива сразу?

Я пытаюсь собрать два массива вместе, и результаты остаются неправильными. Я покажу вам свой код, результаты, которые я получаю, и результаты, которые я ищу.

Наверное, я просто делаю это неправильно, но не знаю, как это сделать.

Мой код:

$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 

Related of "Как я могу пропустить два массива сразу?"

проблема

Ну, конечно, проблема, конечно, в вашей вложенной петле 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/>'; }