【问题标题】:Looping and comparing objects循环和比较对象
【发布时间】:2011-11-14 15:22:30
【问题描述】:

我有两个对象数组,

它们是相同的,只是一个有更多的项目,

所以他们看起来像

Array [arrayA]
(
    [0] => stdClass Object
        (
            [id] => 2
            [name] => interest 1
            [description] => interest one
        )

    [1] => stdClass Object
        (
            [id] => 4
            [name] => interest 3
            [description] => interest three
        )

)



Array [arrayB]
(
    [0] => stdClass Object
        (
            [id] => 1
            [name] => all
            [description] => everything
        )

    [1] => stdClass Object
        (
            [id] => 2
            [name] => interest 1
            [description] => interest one
        )

    [2] => stdClass Object
        (
            [id] => 4
            [name] => interest 3
            [description] => interest three
        )

    [3] => stdClass Object
        (
            [id] => 5
            [name] => interest 4
            [description] => interest four
        )

)

现在我想做的是,循环遍历arrayB,如果在arrayA 中找到对象(也许比较ID?)然后设置[checked] => true 否则设置[checked] = false on arrayB。

最简单的方法是什么?

我想过做也许

foreach($arrayB as &$obj){
    $obj->checked = false;
    foreach($arrayA as $obja){
        if($obja->id == $obj->id){
            $obj->checked = true;
            break;
        }
        if($obja->id > $obj->id) //thanks to De3pTh0ught
            break;
    }
}

但一定有更有效的方法吗?

【问题讨论】:

    标签: php arrays object loops


    【解决方案1】:

    您可以添加检查以减少无用的迭代。如果您知道数组中的对象 ID 将始终按递增顺序排列,则可以包含以下条件:如果 $obja 的 ID 大于 $obj 的 ID,则 break $arrayA 的 foreach 循环,因为这意味着 $obj 将永远找不到匹配项。

    【讨论】:

      【解决方案2】:

      这可以通过这个可怕的 hack(2行!)来完成:

      $p = print_r($arrayA, true);
      foreach($arrayB as &$o) $o->checked =substr_count($p, "[id] => {$o->id}\n") == 1;
      

      【讨论】:

      • 想解释一下吗? (虽然我不认为我会在生产中使用它......很难理解......)
      • 在第 1 行中,我们得到一个字符串,就像您在问题中的内容一样。在第 2 行中,我们遍历 $arrayB 中的 id,并为每个我们组成一个子字符串,如 [id] => 1 并检查 $p 中是否有 2 个实例,我们将此比较的结果分配给 $o->checked
      【解决方案3】:

      在考虑过substr_count 的效率可能有多低之后——想想它的内部实现;它效率不高——我想出了一个稍微不同的方法:

      $b = print_r($arrayA, true);
      foreach($arrayB as &$o) 
           $o->checked = strpos($b, "[id] => {$o->id}" . PHP_EOL, 60) !== false;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-08
        • 2012-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多