[英]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
是月數和dataA
和dataB
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,
],
....
]
我必須既添加dataA
和dataB
的每個數組元素中,如果不存在,那么設置值設置為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_search
和array_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.