PHP Multiple Looping生成新的Array

时间:2014-08-12 02:10:57

标签: php arrays multidimensional-array

我有一些看起来像下面的数组

 array(
    [0] =>
        array( ['direction'] =>  '0.000,0.160,0.123,0.104,0.000' )
    [1] =>
        array( ['direction'] =>  '0.000,0.101,0.237,0.101,0.000' )
    [2] =>
        array( ['direction'] =>  '0.000,0.160,0.125,0.163,0.000' )
  )

使用for循环,我想生成一个看起来像

的新数组
data1 = [0.000, 0.000, 0.000]
data2 = [0.160, 0.101, 0.160]
data3 = [0.123, 0.237, 0.125]
data4 = [0.104, 0.101, 0.163]
data5 = [0.000, 0.000, 0.000]

这意味着使用for循环,我想得到每列的值,然后将该值分配给每个新数组。

我试图做的是

$cnt = count($array);
$buildCnt = count($array['direction']);
for($i = 0; $i < $cnt; $i++){
    for($j = 0; $j < buildCnt; $j++){
     'i need to do something here
    }
}
有人帮我吗? 感谢

5 个答案:

答案 0 :(得分:1)

我不知道通过数组函数是否有更好的方法,你也可以使用正常的foreach循环。像这样:

$original_array = array(
    array('direction' => '0.000,0.160,0.123,0.104,0.000'),
    array('direction' => '0.000,0.101,0.237,0.101,0.000'),
    array('direction' => '0.000,0.160,0.125,0.163,0.000'),
);
$new_array = array();
foreach($original_array as $sub_array) {
    // loop each sub array
    $pieces = explode(',', $sub_array['direction']);
    // explode by comma
    foreach($pieces as $key => $piece) {
        // each piece, push by data(n)
        $new_array["data".($key+1)][] = $piece;
        // if you don't want to use extract
        // ${"data".($key+1)}[] = $piece;
    }
}

extract($new_array); // import newly created sub arrays
echo '<pre>';
print_r($data1); // $data2, $data3, ... and so on

$data1应如下所示:

Array
(
    [0] => 0.000
    [1] => 0.000
    [2] => 0.000
)

答案 1 :(得分:1)

$arr = array(array( 'direction' =>  '0.000,0.160,0.123,0.104,0.000' ),array( 'direction' =>  '0.000,0.101,0.237,0.101,0.000' ),array( 'direction' =>  '0.000,0.160,0.125,0.163,0.000' ));
foreach($arr AS $dirArr){
  $dirs = explode(",",$dirArr['direction']);
  for($i = 0; $i < count($dirs); $i++) $data[$i][] = $dirs[$i];
}

如果你真的需要它们是那些变量名......

$data1 = $data[0];
$data2 = $data[1];
$data3 = $data[2];
$data4 = $data[3];
$data5 = $data[4];

答案 2 :(得分:1)

function loop_array($input) {
    foreach ($input as $val) {
        $mydata = explode(',', $val['direction']);
        foreach ($mydata as $k => $v) {
            $output[$k][] = $v;
        }
    }

    return $output;
}

答案 3 :(得分:1)

$data = array(
    array('direction' => '0.000,0.160,0.123,0.104,0.000'),
    array('direction' => '0.000,0.101,0.237,0.101,0.000'),
    array('direction' => '0.000,0.160,0.125,0.163,0.000')
);

当每个值为exploded时,键将已经匹配您希望将它们放在最终数组中的索引。每个中的第一项将是0,接下来是1等。

示例:

explode(',','0.000,0.160,0.123,0.104,0.000');
array (size=5)
  0 => string '0.000' (length=5)
  1 => string '0.160' (length=5)
  2 => string '0.123' (length=5)
  3 => string '0.104' (length=5)
  4 => string '0.000' (length=5)

那么它就可以直接在输出上重用这些索引。

$output = array();
foreach ($data as $row) {
    // Skip row, handling error from potential missing key.
    // Could also first validate the return from explode.
    if (!isset($row['direction'])) continue;

    foreach (explode(',',$row['direction']) as $key => $value) {
        $output[$key][] = $value;
    }
}
var_dump($output);

结果:

array (size=5)
  0 => 
    array (size=3)
      0 => string '0.000' (length=5)
      1 => string '0.000' (length=5)
      2 => string '0.000' (length=5)
  1 => 
    array (size=3)
      0 => string '0.160' (length=5)
      1 => string '0.101' (length=5)
      2 => string '0.160' (length=5)
  2 => 
    array (size=3)
      0 => string '0.123' (length=5)
      1 => string '0.237' (length=5)
      2 => string '0.125' (length=5)
  3 => 
    array (size=3)
      0 => string '0.104' (length=5)
      1 => string '0.101' (length=5)
      2 => string '0.163' (length=5)
  4 => 
    array (size=3)
      0 => string '0.000' (length=5)
      1 => string '0.000' (length=5)
      2 => string '0.000' (length=5)

geez,被5人殴打!

答案 4 :(得分:1)

此解决方案首先创建一个中间数组,并计算最长的“方向”数组。如果“方向”中的数据点数量不总是相同(这样我们就知道要创建多少个数组),这是必要的。如果“方向”值始终具有相同数量的数据点,则可以简化此操作(请参阅其他答案)。

$data = array(
    array( 'direction' => '0.000,0.160,0.123,0.104,0.000' ),
    array( 'direction' => '0.000,0.101,0.237,0.101,0.000' ),
    array( 'direction' => '0.000,0.160,0.125,0.163,0.000' )
);

$maxLength = 0;
$tempData = array();
foreach( $data as $datum ) {
    $tempDatum = isset( $datum[ 'direction' ] ) ? explode( ',', $datum[ 'direction' ] ) : array();
    $maxLength = max( $maxLength, count( $tempDatum ) );
    $tempData[] = $tempDatum;
}

$newData = array();
for( $i = 0; $i < $maxLength; $i++ ) {
    $new = array();
    for( $j = 0, $len = count( $tempData ); $j < $len; $j++ ) {
        $new[] = isset( $tempData[ $j ][ $i ] ) ? $tempData[ $j ][ $i ] : null;
    }
    $newData[] = $new;
}

var_dump( $newData );