PHP比较二维数组

6
我一直在思考这个问题。
我有两个数组:
数组1从CSV文件中获取:
Array ( [0] => Array ( [uid] => cgajate [date] => 20120918 )
[1] => Array ( [uid] => badrock5 [date] => 20120920 )
[2] => Array ( [uid] => ricoetc [date] => 20120921 )
[3] => Array ( [uid] => ricoetc1 [date] => 20120923 )
[4] => Array ( [uid] => darbyfired [date] => 20120922 )
[5] => Array ( [uid] => sagers.andrew [date] => 20120922 )
[6] => Array ( [uid] => frankfurt9 [date] => 20120923 )
[7] => Array ( [uid] => beachboys [date] => 20120923 )
[8] => Array ( [uid] => panterafan [date] => 20120923 )
[9] => Array ( [uid] => kingsxrules [date] => 20120923 )
[10] => Array ( [uid] => richard.bitto [date] => 20120924 )
[11] => Array ( [uid] => christopher.boss [date] => 20120925 )
[12] => Array ( [uid] => eric.robinson2 [date] => 20120926 )
)
数组2从SQL数据库中获取:
数组
(
    [0] => 数组
        (
            [uid] => cgajate
            [date] => 20120919
        )
[1] => 数组 ( [uid] => ricoetc [date] => 20120921 )
[2] => 数组 ( [uid] => ricoetc1 [date] => 20120922 )
[3] => 数组 ( [uid] => frankfurt9 [date] => 20120923 )
[4] => 数组 ( [uid] => beachboys [date] => 20120923 )
[5] => 数组 ( [uid] => panterafan [date] => 20120923 )
[6] => 数组 ( [uid] => kingsxrules [date] => 20120923 )
[7] => 数组 ( [uid] => eric.robinson2 [date] => 20120926 )
)

我想要做的是检查是否有UID匹配。 如果有匹配,它将检查哪个日期比另一个更当前(所以本质上是哪个日期大于)。 然后它将使用来自两个数组的UID未匹配的数据将它们添加到数组中。

如果难以理解,很抱歉。 这有点难以解释。

非常感谢您的所有帮助,提前感谢您所有人。


太多东西了,哈哈。我似乎无法合并持久数据。我可以输出UID匹配项和我想要保留的日期,但我似乎无法将数据与其余唯一数据合并。 - Christopher
你可能需要了解的是underscore.php,这个库类似于underscore.js,如果您听说过的话。它提供了许多"函数式编程"特性,并且在比较数组时非常有用。 - Zeke Nierenberg
澄清一下。如果数组#1由uid A和B组成,而数组#2由uid B和C组成,则希望得到一个最终数组,其中包含A,C和B的后日期? - David Grenier
数组1包括一系列UID和日期,数组2也是如此。我只想输出唯一的UID以及该UID的最新日期。 - Christopher
2个回答

3

由于PHP数组本身就是哈希表,因此可以遍历一个数组并将每个日期插入到新数组中,以UID为键:

$out = array();
foreach ($first_array as $x) {
    $out[$x['uid']] = $x['date'];
}

接下来,您可以遍历第二个数组,检查任何一个UID是否已经存在于$out数组的键中。如果UID已经存在,则可以比较日期并选择您偏爱的数据片段。例如,类似于以下内容:

foreach ($second_array as $y) {
    if (array_key_exists($y['uid'], $out)) {
        if ($out[$y['uid']] < $y['date']) {
            $out[$y['uid']] = $y['date'];
        }
    } else {
        $out[$y['uid']] = $date;
    }
}

然后,为了将数据压平:
$_out = array();
foreach ($out as $uid => $date) {
    $_out[] = array("uid" => $uid, "date" => $date);
}
$out = $_out;

每个UID都有自己独特的日期。我不认为这会起作用,但感谢您的建议。 - Christopher
如果每个UID都有自己独特的日期,那么这只是去重UID并从每个重复中取最后的日期,对吗?这也应该合并数据集 - 即:第一个和第二个数组中的所有UID都将成为$out中的键。 - Peter Sobot
我一定会尝试并告诉你。 - Christopher
这个不起作用。现在我得到了这个。`数组 ( [cgajate] => 20120919 [badrock5] => [ricoetc] => 20120921 [ricoetc1] => 20120922 [darbyfired] => [sagers.andrew] => [frankfurt9] => 20120923 [beachboys] => 20120923 [panterafan] => 20120923 [kingsxrules] => 20120923 [richard.bitto] => [christopher.boss] => [eric.robinson2] => 20120926 )` - Christopher
如果您需要数据与原始形式完全相同,那么可以将其打平。我已经更新了答案,并提供了一些可能为您完成此操作的代码。 - Peter Sobot
实际上看起来这个代码是有效的。我只发现了一个问题,但是这非常优秀。$out = array(); foreach ($first_array as $x) { $out[$x['uid']] = $x['date']; } 非常感谢! - Christopher

0

代码有点乱,但是能用。

<?php

$arr1 = array(
    array("uid" => "cgajate", "date" => 20120918),
    array("uid" => "badrock5", "date" => 20120920),
    array("uid" => "ricoetc", "date" => 20120921),
    array("uid" => "ricoetc1", "date" => 20120923),
    array("uid" => "darbyfired", "date" => 20120922),
    array("uid" => "sagers.andrew", "date" => 20120922),
    array("uid" => "frankfurt9", "date" => 20120923),
    array("uid" => "beachboys", "date" => 20120923),
    array("uid" => "panterafan", "date" => 20120923),
    array("uid" => "kingsxrules", "date" => 20120923),
    array("uid" => "richard.bitto", "date" => 20120924),
    array("uid" => "christopher.boss", "date" => 20120925),
    array("uid" => "eric.robinson2", "date" => 20120926));


$arr2 = Array(
    array("uid" => "cgajate", "date" => 20120919),
    array("uid" => "ricoetc", "date" => 20120921),
    array("uid" => "ricoetc1", "date" => 20120922),
    array("uid" => "frankfurt9", "date" => 20120923),
    array("uid" => "beachboys", "date" => 20120923),
    array("uid" => "panterafan", "date" => 20120923),
    array("uid" => "kingsxrules", "date" => 20120923),
    array("uid" => "eric.robinson2", "date" => 20120926));

function flatten ($arr) {
    $new_arr = array ();
    foreach ($arr as $sub_arr) {
        $new_arr[$sub_arr["uid"]] = $sub_arr["date"];
    } 
    return $new_arr;
}


$flat_arr1 = flatten ($arr1);
$flat_arr2 = flatten ($arr2);
$arr3 = array ();

foreach ($flat_arr1 as $key=>$value) {
    if (isset ($flat_arr2[$key])) {
        $value = $flat_arr1[$key] > $flat_arr2[$key] ? $flat_arr1[$key] : $flat_arr2[$key];
    }
    $arr3[$key] = $value;
}

foreach ($flat_arr2 as $key=>$value) {
    if (isset ($flat_arr1[$key])) {
        $value = $flat_arr1[$key] > $flat_arr2[$key] ? $flat_arr1[$key] : $flat_arr2[$key];
    }
    $arr3[$key] = $value;
}

?> 

<pre><?php print_r($flat_arr1); ?></pre>

<pre><?php print_r($flat_arr2); ?></pre>

<pre><?php print_r($arr3); ?></pre>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接