Например, если матрица:
1 2 3 4 5 6
Тогда транспонирование над матрицей будет:
1 3 5 2 4 6
Это мой текущий код:
<?php // transpose matrix $trans = array( array(1, 2), array(3, 4), array(5, 6) ); foreach ($trans as $key => $val){ foreach ($trans[$key] as $k => $v){ echo $v; } } ?>
Есть причудливый PHP-способ транспонирования массива 2d:
$trans = array( array(1, 2), array(3, 4), array(5, 6) ); array_unshift($trans, null); $trans = call_user_func_array('array_map', $trans); var_dump($trans);
демонстрация
EDIT Более простой подход с использованием распаковки массива PHP 5.6
С введением функции распаковки аргументов массива в PHP 5.6 мы можем еще более упростить это:
$trans = array( array(1, 2), array(3, 4), array(5, 6) ); $trans = array_map(null, ...$trans); var_dump($trans);
EDIT Пояснение
Цитирование из документов PHP для функции array_map () :
Интересным использованием этой функции является создание массива массивов, который можно легко выполнить, используя NULL в качестве имени функции обратного вызова
(См. Пример № 4 на этой странице документации для примера того, что это делает)
call_user_func_array()
array_unshift($trans, null)
, обеспечивающий обратный вызов NULL, и мы используем call_user_func_array()
потому что мы не обязательно знаем, сколько значений существует в нашем массиве $trans
. То, что мы делаем с использованием этого call_user_func_array()
эквивалентно:
$trans = array_map(NULL, $trans[0], $trans[1], $trans[2]);
для вашего массива примеров, потому что верхний уровень вашего 2-мерного массива имеет три элемента (клавиши 0, 1 и 2).
Эффективно этот обратный вызов NULL циклически проходит через все массивы параллельно, беря каждое из них из очереди, чтобы построить новый массив:
$maxArraySize = max(count($array[0], $array[1], $array[2]); // $maxArraySize will have a value of 2 in your case, // because your sub-arrays are all equal size $newArray = []; for($i = 0; $i < $maxArraySize; ++$i) { $tmpArray = []; $tmpArray[] = $array[0][$i]; $tmpArray[] = $array[1][$i]; $tmpArray[] = $array[2][$i]; $newArray[] = $tmpArray[]; }
Там есть несколько дополнительных чеков
$i
, а не индексу