Цикл и сравнение объектов - PullRequest
       6

Цикл и сравнение объектов

2 голосов
/ 11 сентября 2011

У меня есть два массива объектов,

Они идентичны, за исключением того, что у одного есть больше предметов,

чтобы они выглядели как

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 (может быть, сравнить идентификатор?), А затем установить [checked] => true, иначе установить [checked] = false на 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;
    }
}

Но должен ли быть более эффективный способ?

Ответы [ 3 ]

1 голос
/ 11 сентября 2011

Вы можете добавить проверку, чтобы сократить бесполезные итерации. Если вы знаете, что идентификаторы объектов в ваших массивах всегда будут в порядке возрастания, вы можете включить условие: если идентификатор $ obja больше идентификатора $ obj, то цикл foreach break $ arrayA, потому что это означает, что $ obj будет никогда не находите совпадений.

0 голосов
/ 12 сентября 2011

Подумав, насколько неэффективным может быть substr_count - подумайте о его внутренней реализации;это не может быть очень эффективным - я придумал немного другой метод:

$b = print_r($arrayA, true);
foreach($arrayB as &$o) 
     $o->checked = strpos($b, "[id] => {$o->id}" . PHP_EOL, 60) !== false;
0 голосов
/ 11 сентября 2011

Это можно сделать с помощью этого ужасного хака (в 2 строки!):

$p = print_r($arrayA, true);
foreach($arrayB as &$o) $o->checked =substr_count($p, "[id] => {$o->id}\n") == 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...