PHP:如何对二维数组重新排序


PHP: How to reorder a two dimensional array

这是$myArray的样子:

Array
(
    [0] => Array
        (
            [month] => 1
            [atual] => 0.00
        )
    [1] => Array
        (
            [month] => 2
            [atual] => 11970.99
        )
    [2] => Array
        (
            [month] => 3
            [atual] => 2888.00
        )
    [3] => Array
        (
            [month] => 5
            [atual] => 1500.00
        )
)

我想"填补几个月的空白"。也就是说,对于我们没有数据(4,6,8,9,10,11,12)的那些月份,我希望[atual]为零。

我试过了:

$novo=array();
for ($i=1; $i <=12 ; $i++) {
    $mes=$myArray[$i-1]['month'];
    $atual=$myArray[$i-1]['atual'];
    if(!$mes){
        $novo[$i]=0;
    } else{
        $novo[$i]=$atual;
    }
};

但这又回来了:

Array
(
    [1] => 0.00
    [2] => 11970.99
    [3] => 2888.00
    [4] => 1500.00
    [5] => 0
    [6] => 0
    [7] => 0
    [8] => 0
    [9] => 0
    [10] => 0
    [11] => 0
    [12] => 0
)

[编辑] 现在我看到你还有另一个问题,你的$myArray索引与月份不匹配。

$myArray( 
    array('month' => 1, 'atual' => 0.00),
    array('month' => 2, 'atual' => 11970.99),
    array('month' => 3, 'atual' => 2888.00),
    array('month' => 5, 'atual' => 1500.00)
)
for($i = 1; $i <= 12; $i++){
    $novo[$i] = 0;
}
foreach($myArray as $item){
    $novo[$item['month']] = $item['atual'];
}
print_r($novo);

这奏效了:

$novo=array_fill(1,12,0);
for ($i=1; $i <=12 ; $i++) {
            $mes=$myArray[$i-1]['month'];
            $atual=$myArray[$i-1]['atual'];
            $novo[$mes]=$atual;
};

使用此代码,您可以在位置 1 获得月份 1(而不是位置 0);此外,您只在数组中搜索一次。这不是一个美丽的解决方案,但是...

$my_array = array(
array('month'=>3,'actual'=>100)
);
$results =array();
for($i=1;$i<13;$i++){
    $results[$i] = 0;
}
foreach($my_array as $a){
    $results[$a['month']] = $a['actual'];
}
print_r($results);

PHP 有几个处理排序数组的函数,这里是数组排序函数的比较

我在第一个回复中没有完全理解你的问题。此代码应该适合您。首先,我们将创建一个临时数组,以可访问的格式保存月份和数据。然后我们创建您的数组:

$temp=array();
// Populate the temp array
foreach ($myArray as $row) {
    if (is_array($row) && isset($row["month"])) {
        $temp[$row["month"]] = $row["atual"];
    }
}
// Create novo array
for ($i=0; $i <12 ; $i++) {
    $novo[$i]["month"] = $i+1;
    if (array_key_exists($i+1, $temp)) {
        $novo[$i]['atual'] = $temp[$i+1];
    } else {
        $novo[$i]['atual'] = 0;
    }
}