У меня есть массив в следующем формате:
Array ( [0] => Array ( [0] => a [1] => b [2] => c ) [1] => Array ( [0] => d [1] => e [2] => f ) [2] => Array ( [0] => 0 [1] => 0 [2] => 0 ) [3] => Array ( [0] => 100 [1] => 200 [2] => 300 ) )
Индексы в первом массиве (внешнем), т. Е. 0 для имени, 1 для типа, 2 для ошибки и 3 для размера.
Я должен изменить этот массив в следующем формате:
Array ( [0] => Array ( [name] => a [type] => d [error] => 0 [size] => 100 ) [1] => Array ( [name] => b [type] => e [error] => 0 [size] => 200 ) [2] => Array ( [name] => c [type] => f [error] => 0 [size] => 300 ) )
Есть ли какой-нибудь короткий способ разобраться в этом?
Вы можете сделать это с помощью array_map
:
// $ array - ваш массив $ new_array = array_map (null, $ array [0], $ array [1], $ array [2], $ array [3]); // Затем сменим ключи $ new_array = array_map (function ($ v) { return array ( 'name' => $ v [0], 'type' => $ v [1], 'error' => $ v [2], 'size' => $ v [3] ); }, $ new_array);
Однако простой цикл может быть быстрее.
EDIT: пояснения
Первый вызов array_map
, как описано здесь, реорганизовывает массивы и меняет ключи:
Input: array ('foo1', 'bar1'), array ('foo2', 'bar2') Output: array ('foo1', 'foo2'), array ('bar1', 'bar2')
Обратите внимание на null
значение как обратный вызов.
Тогда второй вызов здесь только для того, чтобы сменить ключи, как требуется OP, заменив индексированный массив на ассоциативный.
Вы могли бы сделать это с хорошей оловянной петлей:
function extract_values($array) { $i = 0; $len = count($array[0]); $result = array(); while($i++ < $len) { $result[] = array( 'name' => array[0], 'type' => array[1], 'error' => array[2], 'size' => array[3] ); } return $result; }
Предполагая, что описанный выше массив хранится в переменной с именем $my_array
, вы можете преобразовать ее с помощью:
$my_array = extract_values($my_array);