簡體   English   中英

用PHP中的數字索引重建數組

[英]rebuild array with numeric index in php

我有一個形式的PHP數組$data

[
    0 => [
        'id' => 3,
        'month' => '2018-03',
        'dataA' => 5,
    ],
    1 => [
         'id' => 4
         'month' => '2018-04',
         'dataA' => 3,
         'dataB' => 2,
    ],
]

id是月數和dataAdataB 5存在的每個陣列中和可能不是。

我必須從第1個月到第12個月對其進行重建,以便

[
    0 => [
       'month' => '2018-01',
       'dataA' => 0,
       'dataB' => 0,
    ],
    1 => [
       'month' => '2018-02',
       'dataA' => 0,
       'dataB' => 0,
    ],
    2 => [
       'month' => '2018-03',
       'dataA' => 5,
       'dataB' => 0,
    ],
    3 => [
       'month' => '2018-04',
       'dataA' => 3,
       'dataB' => 2,
    ],
    ....
]

我必須既添加dataAdataB的每個數組元素中,如果不存在,那么設置值設置為0和月份開始從1至12。

我正在嘗試使用for循環作為

for ($i = 1; $i<=12; $i++) {
   $key = array_search($i, $data);

   print_r($key);
}

但是它會打印匹配值的key ,就像它為$i = 3返回dataA一樣。

如何檢查$data數組中是否存在$i th id

只需從1-12循環並使用array_searcharray_column獲取密鑰

$data = array(
    array(
        'id' => 3,
        'month' => '2018-03',
        'dataA' => 5,
    ),
    array(
         'id' => 4,
         'month' => '2018-04',
         'dataA' => 3,
         'dataB' => 2,
    ),
);

$newData = array();
for ( $i = 1; $i<=12; $i++ ) {
    $key = array_search($i , array_column($data, 'id'));

    $newData[] = array(
        'month' => "2018-" . str_pad($i, 2, "0", STR_PAD_LEFT),
        'dataA' => isset( $data[ $key ]["dataA"] ) && is_int( $key ) ? $data[ $key ]["dataA"] : 0,
        'dataB' => isset( $data[ $key ]["dataB"] ) && is_int( $key ) ? $data[ $key ]["dataB"] : 0,
    );
}

echo "<pre>";
print_r( $newData );
echo "</pre>";

這將導致:

Array
(
    [0] => Array
        (
            [month] => 2018-01
            [dataA] => 0
            [dataB] => 0
        )

    [1] => Array
        (
            [month] => 2018-02
            [dataA] => 0
            [dataB] => 0
        )

    [2] => Array
        (
            [month] => 2018-03
            [dataA] => 5
            [dataB] => 0
        )

    [3] => Array
        (
            [month] => 2018-04
            [dataA] => 3
            [dataB] => 2
        )

    [4] => Array
        (
            [month] => 2018-05
            [dataA] => 0
            [dataB] => 0
        )

    [5] => Array
        (
            [month] => 2018-06
            [dataA] => 0
            [dataB] => 0
        )

    [6] => Array
        (
            [month] => 2018-07
            [dataA] => 0
            [dataB] => 0
        )

    [7] => Array
        (
            [month] => 2018-08
            [dataA] => 0
            [dataB] => 0
        )

    [8] => Array
        (
            [month] => 2018-09
            [dataA] => 0
            [dataB] => 0
        )

    [9] => Array
        (
            [month] => 2018-10
            [dataA] => 0
            [dataB] => 0
        )

    [10] => Array
        (
            [month] => 2018-11
            [dataA] => 0
            [dataB] => 0
        )

    [11] => Array
        (
            [month] => 2018-12
            [dataA] => 0
            [dataB] => 0
        )

)

使用array_reduce() + array_replace()函數的完整解決方案:

$arr = [
    0 => [
        'id' => 3,
        'month' => '2018-03',
        'dataA' => 5,
    ],
    1 => [
         'id' => 4,
         'month' => '2018-04',
         'dataA' => 3,
         'dataB' => 2,
    ],
];
$curr_months = array_reduce($arr, function($r, $a){
    unset($a['id']);
    $r[$a['month']] = $a;
    return $r;
}, []);

$m_pfx = '2018-';
$result = [];
foreach (range(1, 12) as $i) {
    $k = sprintf("%d-%02d", $m_pfx, $i);
    $curr_item = (isset($curr_months[$k]))? $curr_months[$k] : [];
    $item = array_replace(['month' => $k, 'dataA' => '', 'dataB' => ''], $curr_item);
    $result[] = $item;
}    

print_r($result);

輸出:

Array
(
    [0] => Array
        (
            [month] => 2018-01
            [dataA] => 
            [dataB] => 
        )

    [1] => Array
        (
            [month] => 2018-02
            [dataA] => 
            [dataB] => 
        )

    [2] => Array
        (
            [month] => 2018-03
            [dataA] => 5
            [dataB] => 
        )

    [3] => Array
        (
            [month] => 2018-04
            [dataA] => 3
            [dataB] => 2
        )

    [4] => Array
        (
            [month] => 2018-05
            [dataA] => 
            [dataB] => 
        )

    [5] => Array
        (
            [month] => 2018-06
            [dataA] => 
            [dataB] => 
        )

    [6] => Array
        (
            [month] => 2018-07
            [dataA] => 
            [dataB] => 
        )

    [7] => Array
        (
            [month] => 2018-08
            [dataA] => 
            [dataB] => 
        )

    [8] => Array
        (
            [month] => 2018-09
            [dataA] => 
            [dataB] => 
        )

    [9] => Array
        (
            [month] => 2018-10
            [dataA] => 
            [dataB] => 
        )

    [10] => Array
        (
            [month] => 2018-11
            [dataA] => 
            [dataB] => 
        )

    [11] => Array
        (
            [month] => 2018-12
            [dataA] => 
            [dataB] => 
        )
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM