【问题标题】:Using array_diff() on arrays who holds several objects [duplicate]在包含多个对象的数组上使用 array_diff() [重复]
【发布时间】:2015-06-16 11:41:24
【问题描述】:

我有两个数组。第一个数组保存这些值。

[a] => stdClass Object
    (
        [name] => Chris
        [id] => AaKk4j0abEkJSSxYKKnss2LTZc9BmMDrYmm1TFxkIHR8PSU50OagCsl2pgJjVTm7MrkVBVcJgydJGViRU4HHClyWVm3arL4Y5cdWKyZQHtdltg
    )

[b] => stdClass Object
    (
        [name] => John
        [id] => AaL4_sWesWgGcHsd3eoBB3NDvpekzTQHE1J9zLUJs6zZPY7urzXzuhvA3uWuW0IOGiRJPznFsCIJFzZkm2_vIlSU93njnSwgiJbM1fmI9fUulw
    )

[c] => stdClass Object
    (
        [name] => James
        [id] => AaJ3g8G-nssIY7rhMq6pGMI5989ICREh7_MQ37Vre8oNuaBkO-HFgNUWcH2tZdyFwsWOv_kG4eVliss-FY_HmRFh4gmROJKkFCFKMjzatc_2iw
    )

第二个数组保存这些值。

[d] => stdClass Object
    (
        [id] => 1003880559625244
        [name] => Aftab
    )

[e] => stdClass Object
    (
        [id] => 448636891977424
        [name] => John
    )

[f] => stdClass Object
    (
        [id] => 809530442478820
        [name] => James
    )

[g] => stdClass Object
    (
        [id] => 809530442478820
        [name] => Chris
    )

我正在尝试比较两个数组并仅获取不匹配的值。
例如,在这种情况下,Aftab 是数组 1 中不存在且唯一的那个。
我曾尝试在 PHP 中使用 array_diff() 函数执行此操作,但出现此错误:

可捕获的致命错误:stdClass 类的对象无法转换为字符串

【问题讨论】:

  • 两个数组中的名称值是否唯一?
  • 所有 id 都是唯一的,而不是名称。我必须选择所有不匹配的名称
  • 您的示例中的 ID 不一样。如果您在两个记录集中都有唯一且一致的内容,则只需循环两个数组并将索引替换为一致的标识符,然后使用array_diff_key()

标签: php arrays object array-difference


【解决方案1】:

使用array_udiff - 通过使用回调函数进行数据比较来计算数组的差异。 http://us.php.net/array_udiff

function compare_names($a, $b)
{
    return strcmp($a->name, $b->name);
}
$newarr = array_udiff($b, $a, 'compare_names');

【讨论】:

    【解决方案2】:
    try this for multidimensional array   
    
     $array1 = array(
            'a' => array('name' => 'Chris', 'id' => 'AaKk4j0abEkJSSxYKKnss2LTZc9BmMDrYmm1TFxkIHR8PSU50OagCsl2pgJjVTm7MrkVBVcJgydJGViRU4HHClyWVm3arL4Y5cdWKyZQHtdltg'),
            'b' => array('name' => 'John', 'id' => 'AaL4_sWesWgGcHsd3eoBB3NDvpekzTQHE1J9zLUJs6zZPY7urzXzuhvA3uWuW0IOGiRJPznFsCIJFzZkm2_vIlSU93njnSwgiJbM1fmI9fUulw'),
            'c' => array('name' => 'James', 'id' => 'AaJ3g8G-nssIY7rhMq6pGMI5989ICREh7_MQ37Vre8oNuaBkO-HFgNUWcH2tZdyFwsWOv_kG4eVliss-FY_HmRFh4gmROJKkFCFKMjzatc_2iw')
        );
    
        $array2 = array(
            'd' => array('name' => 'Aftab','id'=>'1003880559625244'),
            'e' => array('name' => 'John','id'=>'448636891977424'),
            'f' => array('name' => 'James','id'=>'809530442478820'),
            'g' => array('name' => 'Chris','id'=>'809530442478820'),
        );
        $result = check_diff_multi($array1, $array2);
        print '<pre>';
        print_r($result);
        print '</pre>';
        function check_diff_multi($array1, $array2){
            $result = array();
            foreach($array1 as $key => $val) {
                 if(isset($array2[$key])){
                   if(is_array($val) && $array2[$key]){
                       $result[$key] = check_diff_multi($val, $array2[$key]);
                   }
               } else {
                   $result[$key] = $val;
               }
            }
    
            return $result;
        }
    

    为了得到你想要的输出

    [d] => stdClass Object ( [id] => 1003880559625244 [name] => Aftab ) 
    
    $diff = array_udiff($array2,
    $array1,
    function($array2,$array1){
        return strcmp($array1["name"], $array2["name"]);
        }); 
        print_r($diff);
    

    输出:

    Array ( [d] => Array ( [name] => Aftab [id] => 1003880559625244 ) ) 
    

    【讨论】:

    • 没有兄弟它不工作。它返回给我完整的第二个数组。这些数组来自一个 api
    • 你想要的结果是什么?
    • [d] => stdClass 对象([id] => 1003880559625244 [name] => Aftab)
    • $diff = array_udiff($array2, $array1, function($array2,$array1){ return strcmp($array1["name"], $array2["name"]); }); print_r($diff);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 2021-09-17
    • 2023-02-01
    • 2020-11-29
    相关资源
    最近更新 更多