2015-10-02 6 views
4

У меня есть массив данных, какПравильный способ преобразования PHP массив

$data = [ 
    'name' => [ 
     (int) 0 => '095a108478345cac184f956b1e8dee91a5a89f87bbabd7b3fb4058f577adf.jpg', 
     (int) 1 => '02059.jpg', 
     (int) 2 => 'avatar.jpg' 
    ], 
    'type' => [ 
     (int) 0 => 'image/jpeg', 
     (int) 1 => 'image/jpeg', 
     (int) 2 => 'image/jpeg' 
    ], 
    'tmp_name' => [ 
     (int) 0 => 'C:\xampp\tmp\php17AA.tmp', 
     (int) 1 => 'C:\xampp\tmp\php17BA.tmp', 
     (int) 2 => 'C:\xampp\tmp\php17BB.tmp' 
    ], 
    'error' => [ 
     (int) 0 => (int) 0, 
     (int) 1 => (int) 0, 
     (int) 2 => (int) 0 
    ], 
    'size' => [ 
     (int) 0 => (int) 80542, 
     (int) 1 => (int) 6532, 
     (int) 2 => (int) 6879 
    ] 
    ] 

И мне нужно преобразовать в массив как этот

$data = [ 
    (int) 0 => [ 
     'name' => '095a108478345cac184f956b1e8dee91a5a89f87bbabd7b3fb4058f577adf.jpg', 
     'type' => 'image/jpeg', 
     'tmp_name' => 'C:\xampp\tmp\php17AA.tmp', 
     'error' => (int) 0, 
     'size' => (int) 80542 
    ], 
    (int) 1 => [ 
     'name' => '02059.jpg', 
     'type' => 'image/jpeg', 
     'tmp_name' => 'C:\xampp\tmp\php17BA.tmp', 
     'error' => (int) 0, 
     'size' => (int) 6532 
    ], 
    (int) 2 => [ 
     'name' => 'avatar.jpg', 
     'type' => 'image/jpeg', 
     'tmp_name' => 'C:\xampp\tmp\php17BB.tmp', 
     'error' => (int) 0, 
     'size' => (int) 6879 
    ] 
    ] 

Я ищу правильный способ преобразовать первый PHP массив к второму. Есть ли какие-либо функции массива PHP, предусмотренные для этих действий. Либо возможно с управлением массивом CakePHP?

Да, я могу сделать несколько циклов foreach и создать массив, в котором я нуждаюсь, но я не уверен, есть ли более элегантный способ.

ответ

3

Из PHP 5.5 вы можете использовать array_column и array_combine, чтобы сделать это.

$ret = []; $keys = array_keys($data); 
for ($i=0; $i<3; $i++) { 
    $ret[$i] = array_combine($keys, array_column($data, $i)); 
} 

Где 3 это количество элементов name, type, tmp_name и т.д.

Demo.

То же самое для PHP 5.5 <

$ret = []; $keys = array_keys($data); 
for ($i=0; $i<3; $i++) { 
    $ret[$i] = array_combine($keys, array_map(function($element) use ($i){ 
     return $element[$i]; 
    }, $data)); 
} 

Demo.

А вот пример, для полноты картины, лишь два foreach:

$ret = []; 
foreach($data as $key => $val) { 
    $i = 0; 
    foreach ($val as $v) { 
     $ret[$i][$key] = $v; 
     $i++; 
    } 
} 

который, кстати, я хотел бы использовать независимо от других реализаций.