簡體   English   中英

如何比較和以后合並兩個多維數組

[英]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;
}, []));

https://3v4l.org/fSVoj

我正在做的是組合數組(它們都是子集,因此沒有固有的沖突),然后遍歷並“簡化”為數組鍵>值配對,鍵是日期/時間,值是集合。 這樣可以產生將每個日期/時間合並到該數組中相同鍵的效果。 在這種情況下,回調僅“記住”遇到的最后一個日期/時間塊,因此出現“不確定需要什么”的問題。

最后,我得到了數組的版本,其中日期/時間被索引( 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.

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