当数组具有子数组时,array_intersect会引发错误

时间:2013-09-25 16:18:51

标签: php arrays multidimensional-array array-intersect

我正在尝试使用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中进行数组到字符串的转换

并且实际上并没有进行比较。

比较两个阵列而不重新发明轮子或达到过于复杂的东西的最佳方法是什么?

2 个答案:

答案 0 :(得分:5)

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找到了这些,并按照相关的函数链接进行了操作。这是看待做事的替代方案的好方法。

答案 1 :(得分:2)

其他人建议使用array_map和serialize。我最终想出了这个 - 这肯定比嵌套和递归容易得多,并且在尝试基本上重写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>';