2

我正在编写一个脚本来比较一个玩家在游戏中的成就。在每个数组中,id 和时间戳将在某些条目上匹配。我已经包含了 2 个单独数组的开头之一的示例:

Array
(
    [0] => Array
        (
            [id] => 8213
            [timestamp] => 1384420404000
            [url] => http://www.wowhead.com/achievement=8213&who=Azramon&when=1384420404000
            [name] => Friends In Places Higher Yet
        )

    [1] => Array
        (
            [id] => 6460
            [timestamp] => 1384156380000
            [url] => http://www.wowhead.com/achievement=6460&who=Azramon&when=1384156380000
            [name] => Hydrophobia
        )

我想找到 id 和时间戳匹配的所有数组项。我已经查看了 array_intersect 但我认为这不是我正在寻找的,因为它只会在条目相同时找到项目。非常感谢任何帮助。

4

3 回答 3

1

你可以使用array_intersect_assoc函数。

于 2013-11-15T08:54:04.633 回答
0

尝试这样的事情:

<?php
   $key_match = Array();
   //Loop first array
   foreach($array as $key => $element){
      //Compare to second array 
      if($element == $array2[$key]){
          //Store matching keys
          $key_match[] = $key;
      }
   }
?>

$key_match 将是一个包含所有匹配键的数组。

(我在工作,没有时间测试代码)

希望能帮助到你

编辑:下面的完整工作示例:

<?php
$a1["t"] = "123";
$a1["b"] = "124";
$a1["3"] = "125";
$a2["t"] = "123";
$a2["b"] = "124";
$a2["3"] = "115";

$key_match = Array();

    //Loop first array
    foreach($a1 as $key => $element){
        //Compare to second array 
        if($element == $a2[$key]){
           //Store matching keys
           $key_match[] = $key;
   }
}

var_dump($key_match);
?>
于 2013-11-15T08:32:54.720 回答
0

如果您想继续探索数组回调函数,请查看array_uintersect。它与 array_intersect 类似,只是您指定了一个用于比较的函数。这意味着您可以自己编写。

不幸的是,您需要实现一个基于小于、等于、大于返回 -1、0 或 1 的函数,因此您需要更多代码。但我怀疑这将是做你正在寻找的最有效的方式。

function compareArrays( $compareArray1, $compareArray2 ) {
    if ( $compareArray1['id'] == $compareArray2['id'] && $compareArray1['timestamp'] == $compareArray2['timestamp'] ) {
        return 0;
    }
    if ( $compareArray1['id'] < $compareArray2['id']  ) {
        return -1;
    }
    if ( $compareArray1['id'] > $compareArray2['id']  ) {
        return 1;
    }
    if ( $compareArray1['timestamp'] < $compareArray2['timestamp']  ) {
        return -1;
    }
    if ( $compareArray1['timestamp'] > $compareArray2['timestamp']  ) {
        return 1;
    }
}

var_dump( array_uintersect( $array1, $array2, "compareArrays") );
于 2013-11-15T09:29:27.837 回答