1

我试图用来array_intersect比较两个数组数组。

$start[]=array(
        'id'=>1,
        'name'=>'Up',
        'action'=>'up'
);
$start[]=array(
        'id'=>3,
        'name'=>'Down',
        'action'=>'down'
);
$start[]=array(
        'id'=>5,
        'name'=>'Left',
        'action'=>'left'
);




$end[]=array(
        'id'=>1,
        'name'=>'Up',
        'action'=>'up'
);
$end[]=array(
        'id'=>9,
        'name'=>'Up',
        'action'=>'up'
);

$result=array_intersect($start,$end);

但是,我总是收到通知消息:

注意:在xyz行的 testfile.php 中数组到字符串的转换

而且这种比较实际上并没有发生。

在不重新发明轮子或得出过于复杂的东西的情况下比较两个数组的最佳方法是什么?

4

2 回答 2

6

array_diff 和 array_intersect 将主数组中的每个元素转换为字符串以进行比较。如果您想要不同的比较,那么您可以使用带有以下内置函数的回调方法:

array_uintersect_assoc() - Computes the intersection of arrays with additional index check, compares data by a callback function
array_intersect_uassoc() - Computes the intersection of arrays with additional index check, compares indexes by a callback function
array_uintersect_uassoc() - Computes the intersection of arrays with additional index check, compares data and indexes by a callback functions

我通过在 PHP.net 中搜索函数 array_diff 找到了这些,并遵循了相关的函数链接。这是查看做某事的替代方案的好方法。

于 2013-09-25T16:26:48.287 回答
2

其他地方的其他人建议使用 array_map 并进行序列化。我最终想出了这个——这肯定比嵌套和递归要容易得多,而且在尝试基本上重写 array_intersect 函数时惨遭失败。

echo '<pre>';

$start[]=array(
        'id'=>1,
        'name'=>'Up',
        'action'=>'up'
);
$start[]=array(
        'id'=>3,
        'name'=>'Down',
        'action'=>'down'
);
$start[]=array(
        'id'=>5,
        'name'=>'Left',
        'action'=>'left'
);
$start[]=array(
        'id'=>2,
        'name'=>'Left',
        'action'=>'left'
);





$end[]=array(
        'name'=>'Up',
        'id'=>1,

        'action'=>'up'
);
$end[]=array(
        'id'=>8,
        'name'=>'Right',
        'action'=>'Right'
);




function serialize_array_values($arr){
    foreach($arr as $key=>$val){
        sort($val);
        $arr[$key]=serialize($val);
    }

    return $arr;
}




$result = array_map("unserialize", array_intersect(serialize_array_values($start),serialize_array_values($end)));

echo "\n\n\n";
echo var_dump($result);


echo '</pre>';
于 2013-09-25T19:15:30.610 回答