【问题标题】:array_intersect throws errors when arrays have sub-arrays当数组有子数组时,array_intersect 会抛出错误
【发布时间】:2013-10-01 08:32:06
【问题描述】:

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

实际上并没有进行比较。

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

【问题讨论】:

    标签: php arrays multidimensional-array array-intersect


    【解决方案1】:

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

    【讨论】:

    • 没有额外的索引可供检查。这些功能都不能自行解决问题。我会回电什么?
    • 好吧,如果它的 ALWAYS 是一个二维数组,那么回调另一个数组比较函数就可以了。也可以编写另一个专门构建的函数。这个想法是让 PHP 进行迭代,并根据给定情况编写比较函数。
    • 我没有要提供的额外索引——而且我什至不确定应该执行索引检查。什么比较回调函数比较合适?
    • 索引检查只是另一个级别的数组比较。如果不需要,则始终返回“索引匹配”的回调将起作用。这是关于 Stack Overflow 的另一个可能有用的答案:stackoverflow.com/questions/3876435/recursive-array-diff
    • 这是差异,不是相交。
    【解决方案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>';
    

    【讨论】:

    • 这破坏了我原来的数组
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    相关资源
    最近更新 更多