【问题标题】:php, compare arrays and append differencephp,比较数组并追加差异
【发布时间】:2016-02-11 02:14:18
【问题描述】:

我有这两个数组:

1:

Array
(
    [0] => stdClass Object
        (
            [id] => 1
            [name] => Type 1
            [rate] => 100.00
        )

    [1] => stdClass Object
        (
            [id] => 2
            [name] => Type 2
            [rate] => 75.00
        )

    [2] => stdClass Object
        (
            [id] => 3
            [name] => Type 3
            [rate] => 50.00
        )

    [3] => stdClass Object
        (
            [id] => 4
            [name] => Type 4
            [rate] => 50.00
        )
)

2:

Array
(
    [0] => stdClass Object
        (
            [name] => Type 1
            [rate] => 125
        )

    [1] => stdClass Object
        (
            [name] => Type 2
            [rate] => 85
        )

    [2] => stdClass Object
        (
            [name] => Type 3
            [rate] => 65
        )

)

我需要做的是比较两个数组,并将第一个数组中的缺失项附加到第二个数组。这将始终是第一个数组比第二个数组包含更多项目的情况。

我尝试过使用类似的东西:

$result = array_udiff($array1,$array2,
 function ($obj_a, $obj_b) {
    return $obj_a->name - $obj_b->name;
  }
);

但它只是返回一个空数组

【问题讨论】:

  • return $obj_a->name - $obj_b->name; 中的减号是这里出现的错字吗?应该有一个==。
  • 不清楚什么是缺少的物品。你只关心name成员的对象不同吗?
  • 您的问题需要澄清,因为您的示例不清楚。您的第一个数组有一个名称 = 'Type 1',比率为 100.00,而第二个数组有一个 'Type 1',比率为 125。什么构成应附加到 array2 的“新”元素?
  • @gview 值在这种情况下无关紧要。也许我应该使用数组键来比较差异
  • 如果对象所在的数组相同,可以使用array_merge。

标签: php arrays


【解决方案1】:

这个?

<?php

    $arr1 = array(
        (object)array("id"=>1,"name"=>"type 1","rate"=>100.00),
        (object)array("id"=>2,"name"=>"type 2","rate"=>75.00),
        (object)array("id"=>3,"name"=>"type 3","rate"=>50.00),
        (object)array("id"=>4,"name"=>"type 4","rate"=>50.00)
        );

    $arr2 = array(
        (object)array("name"=>"type 1","rate"=>125),
        (object)array("name"=>"type 2","rate"=>85),
        (object)array("name"=>"type 3","rate"=>65)
        );


    for($i=0;$i<sizeof($arr1);$i++){

        $count=0;
        for($j=0;$j<sizeof($arr2);$j++){

            if($arr1[$i]->name == $arr2[$j]->name){

                $count++;
            }
        }

        if($count==0){

            array_push($arr2,(object)array("name"=>$arr1[$i]->name,"rate"=>$arr1[$i]->rate));
        }
    }

    print_r($arr2);
?>

【讨论】:

  • 希望能帮到你。
【解决方案2】:

不需要很复杂,假设您允许数组包含相同类型和结构的对象。我们没有足够的上下文来理解这个问题是否有充分的理由你不能。

//$array1 original array
//$array2 target array

$array2 = array_merge($array1, $array2);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-30
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多