2014-10-14 4 views
1

Есть ли встроенная функция PHP, которая обеспечивает следующий эффект? Я не знаю, как описать эту проблему, но я чувствую, что я видел решение где-то раньше:php изменение расположения/ориентации многомерного массива

Как изменить это:

array(
    ['name'] => array(
     [0] => 'Pat', 
     [1] => 'Sam', 
     [2] => 'Chris' 
    ), 
    ['score'] => array (
     [0] => '100', 
     [1] => '95', 
     [2] => '109' 
    ), 

    ['color'] => array (
     [0] => 'blue', 
     [1] => 'red', 
     [3] => 'green' 
    ) 
) 

к этому:

array(
    [0] => array(
     ['name'] => 'Pat', 
     ['score'] => '100', 
     ['color'] => 'blue' 
    ), 
    [1] => array(
     ['name'] => 'Sam', 
     ['score'] => '95', 
     ['color'] => 'red' 
    ), 
    [2] => array(
     ['name'] => 'Chris', 
     ['score'] => '109', 
     ['color'] => 'green' 
    ) 
) 

Если нет, будет ли рекурсивная функция подходящим способом решения этого?

+1

Это называется [транспонирование] (http://stackoverflow.com/questions/797251/transposing-multidimensional-arrays-in-php) – pguardiario

ответ

0

Я не знаю никаких встроенных функций, но несколько циклов должны делать трюк.

$ar = array(
    'name' => array(
     0 => 'Pat', 
     1 => 'Sam', 
     2 => 'Chris' 
    ), 
    'score' => array (
     0 => '100', 
     1 => '95', 
     2 => '109' 
    ), 

    'color' => array (
     0 => 'blue', 
     1 => 'red', 
     3 => 'green' 
    ), 
); 
$new_ar = array(); 
foreach($ar as $key => $val) { 
    foreach($val as $key2 => $val2) { 
     $new_ar[$key2][$key] = $val2; 
    } 
} 
print_r($new_ar); 
+0

Sry - сделал крошечную ошибку, теперь она исправлена. – smokiespartakus

0
$arr = array(
    'name'=> array('Pat', 'Sam', 'Chris'), 
    'score'=> array ('100', '95','109'), 
    'color'=> array ('blue', 'red', 'green') 
); 
array_unshift($arr, null); 
echo "<pre>"; print_r(call_user_func_array('array_map', $arr)); 
0

Попробуйте это будет вызывающе помочь вам

<?php 

$old = array(
     'name' => array('Pat', 'Sam','Chris'), 
     'score' => array('100', '95','109'), 
     'color' => array('blue', 'red','green'), 
); 

foreach($old as $key => $value){ 
    $i = 0; 
    foreach($value as $sub_key => $sub_value){ 
     $new[$i][$key] = $sub_value; 
     $i++; 
    } 
} 
print_r($new); 

?> 

Выход:

Array 
(
    [0] => Array 
     (
      [name] => Pat 
      [score] => 100 
      [color] => blue 
     ) 

    [1] => Array 
     (
      [name] => Sam 
      [score] => 95 
      [color] => red 
     ) 

    [2] => Array 
     (
      [name] => Chris 
      [score] => 109 
      [color] => green 
     ) 

) 
0

Ваш первый массив представляет собой 2-мерный массив, то есть матрицу и от математической Точка зрения, ваш желаемый результат - транспонированная матрица (но сохранение ключей), таким образом вы можете посмотреть here для некоторых ответов относительно транспонирования матриц в PHP. Я также адаптированный ответ от указанного вопроса для Вашего случая:

$arr = array(
    'name' => array('Pat', 'Sam', 'Chris'), 
    'score' => array ('100', '95', '109'), 
    'color' => array ('blue', 'red', 'green') 
); 

$arr_keys = array_keys($arr); 

array_unshift($arr, function(){ 
    return array_combine($GLOBALS['arr_keys'], func_get_args()); 
}); 

$result = call_user_func_array('array_map', $arr); 

print_r($result);