[英]How to compare and later merge two multidimensional arrays
我正在嘗試以以下方式合並兩個多維數組(示例數組僅是示例,真正的數組很長,並且有成千上萬個項目):
$ array_a:
[0] => Array
(
[date] => 2018-02-25 15:12
[request] => 0
)
[1] => Array
(
[date] => 2018-02-25 15:13
[request] => 0
)
[2] => Array
(
[date] => 2018-02-25 15:14
[request] => 0
)
[3] => Array
(
[date] => 2018-02-25 15:15
[request] => 0
)
$ array_b:
[0] => Array
(
[date] => 2018-02-25 15:12
[request] => 11
)
[1] => Array
(
[date] => 2018-02-25 15:13
[request] => 5
)
[2] => Array
(
[date] => 2018-02-25 15:15
[request] => 2
)
所需結果:
[0] => Array
(
[date] => 2018-02-25 15:12
[request] => 11
)
[1] => Array
(
[date] => 2018-02-25 15:13
[request] => 5
)
[2] => Array
(
[date] => 2018-02-25 15:14
[request] => 0
)
[3] => Array
(
[date] => 2018-02-25 15:15
[request] => 2
)
任何? 謝謝。
一種方法:
foreach($a as $v) {
$res[$v['date']] = $v['request'];
}
foreach($b as $v) {
if(isset($res[$v['date']])) {
if($v['request'] > $res[$v['date']])
$res[$v['date']] = $v['request'];
} else {
$res[$v['date']] == $v['request'];
}
}
foreach($res as $k=>$v)
$out[] = array("date" => $k, "request" => $v);
其中$a
和$b
是您的數組,而$out
是最終結果。
這個怎么運作:
由於我們正在比較日期,並且知道它們是唯一的,因此我們將它們放入一個臨時數組(在我的情況下$res
)作為元素的鍵(數組的鍵是唯一的)。 對於每個元素的值,我們比較請求的值並存儲更大的請求。
因此,第一個foreach
循環遍歷第一個數組,並以以下形式將元素添加到$res
中:
$res['2018-02-25 15:12'] = 0;
第二個foreach
循環foreach
第二個數組的所有元素,但是,在這里,我們還要確保對請求使用更大的值。
因此, if
邏輯檢查元素是否存在,如果存在,則為請求獲取更大的值並將其存儲到日期。 如果不是,它將完全執行第一個foreach
循環中的操作(創建新元素)。
最后,我們希望將數組放到看起來像的樣子,因此我們遍歷$res
並重新創建數組,就像原來的兩個一樣。 結果$out
保留了您所請求的內容。
我可以給你結果,但是我不知道回調主體中的邏輯。
$array_c = array_values(array_reduce(array_merge($a, $b), function($carry, $item) {
$carry[$item['date']] = $item;
return $carry;
}, []));
我正在做的是組合數組(它們都是子集,因此沒有固有的沖突),然后遍歷並“簡化”為數組鍵>值配對,鍵是日期/時間,值是集合。 這樣可以產生將每個日期/時間合並到該數組中相同鍵的效果。 在這種情況下,回調僅“記住”遇到的最后一個日期/時間塊,因此出現“不確定需要什么”的問題。
最后,我得到了數組的版本,其中日期/時間被索引( array_values()
)取代。 這也很有趣,因為如果將array_values()
調用移到后面, array_values()
日期排序將相當容易。
這給出:
array(4) {
[0]=>
array(2) {
["date"]=>
string(16) "2018-02-25 15:12"
["request"]=>
int(11)
}
[1]=>
array(2) {
["date"]=>
string(16) "2018-02-25 15:13"
["request"]=>
int(5)
}
[2]=>
array(2) {
["date"]=>
string(16) "2018-02-25 15:14"
["request"]=>
int(0)
}
[3]=>
array(2) {
["date"]=>
string(16) "2018-02-25 15:15"
["request"]=>
int(2)
}
}
可以完成不同的操作,例如僅保留第一個請求,或添加每個請求(第一個數組中的請求都為零)。 雖然機制應該相同。
如果您必須添加值,則可以使用如下所示的內容:
$out = [];
// create new array using date as key, "object" as value.
foreach ($arr1 as $itm) {
$out[$itm['date']] = $itm;
}
// foreach each element of the second array,
foreach ($arr2 as $itm) {
// if it doesn't exists in the out array, simply add it
if (!isset($out[$itm['date']])) $out[$itm['date']] = $itm ;
// otherwise, add request to the first
else $out[$itm['date']]['request'] += $itm['request'];
}
ksort($out); // Sort by date (Optional)
$out = array_values($out); // get values to remove dates from keys
print_r($out);
輸出:
Array
(
[0] => Array
(
[date] => 2018-02-25 15:12
[request] => 11
)
[1] => Array
(
[date] => 2018-02-25 15:13
[request] => 5
)
[2] => Array
(
[date] => 2018-02-25 15:14
[request] => 0
)
[3] => Array
(
[date] => 2018-02-25 15:15
[request] => 2
)
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.