2013-12-09 117 views
0

我有一个二维阵列是这样的:转换二维阵列到多个单个阵列

Array 
(
    [id] => Array 
     (
      [0] => 1 
     ) 
    [name] => Array 
     (
      [0] => john 
     ) 
    [dept] => Array 
     (
      [0] => val_1 
      [1] => val_2 
     ) 
    [to] => Array 
     (
      [0] => one 
      [1] => two 
     ) 
) 

反正我可以将此数组转换为多个单阵列类似如下:

Array 
(
    [id] => 1 
    [name] => john 
    [dept] => val_1 
    [to] => one 
) 
Array 
(
    [id] => 1 
    [name] => john 
    [dept] => val_1 
    [to] => two 
) 
Array 
(
    [id] => 1 
    [name] => john 
    [dept] => val_2 
    [to] => one 
) 
Array 
(
    [id] => 1 
    [name] => john 
    [dept] => val_2 
    [to] => two 
) 

我用array_merge,但没有得到我真正想要的。任何帮助表示赞赏

+2

我想你应该重新设计你的阵列结构.. 。这看起来真的很差 – ins0

+0

实际上,它是一维数组,但每个内部值都是逗号分隔值 – PyQL

回答

0

试试这个(解决方案可能不是最干净的,但!):

→ live @ Ideone.com

<?php 

$arr = [ 
    'id' => [ 
     1 
    ], 
    'name' => [ 
     'john' 
    ], 
    'dept' => [ 
     'val_1', 'val_2' 
    ], 
    'to' => [ 
     'one', 'two' 
    ] 
]; 

function convert($arr, $outArrCount) { 
    $total = []; 
    for ($i=0; $i<$outArrCount; $i++) { 
     $entry = []; 
     array_walk($arr, function ($val, $key) use (&$entry, $i, $outArrCount) { 
      if (count($val) > 1) { 
       $entry[$key] = $val[ floor((count($val)/$outArrCount) * $i) ]; 
      } 
      else { 
       $entry[$key] = $val; 
      } 

     }); 
     $total[] = $entry; 
    }; 
    return $total; 
} 
var_dump(convert($arr, 4)); 
0

使用此功能将帮助你重组你的数组。

function loopArrayMerger(array $array) { 
    if (! $array) { 
     return array(); 
    } 

    return call_user_func_array ('array_merge', $array); 
} 
0

我发现下面的函数有助于回答我的问题:

function array_cartesian() { 
    $_ = func_get_args(); 
    if(count($_) == 0) 
     return array(array()); 
    $a = array_shift($_); 
    $c = call_user_func_array(__FUNCTION__, $_); 
    $r = array(); 
    foreach($a as $v) 
     foreach($c as $p) 
      $r[] = array_merge(array($v), $p); 
    return $r; 
} 

我可以按如下方式使用它:

$cross = array_cartesian(
    $arr[id], 
    $arr[name], 
    $arr[dept], 
    $arr[to]); 
print_r($cross);