PHP 多重循环以生成新的数组


PHP Multiple Looping to generate new 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
    }
}

有人帮我吗??谢谢

我不知道

是否有更好的方法通过数组函数,你也可以使用普通的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
)
$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];
function loop_array($input) {
    foreach ($input as $val) {
        $mydata = explode(',', $val['direction']);
        foreach ($mydata as $k => $v) {
            $output[$k][] = $v;
        }
    }
    return $output;
}

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

$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 );
$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)

天哪,被5个人打到它!