Как искать в массиве std-объекта (массиве объектов) с помощью php-функции in_array?

У меня есть следующий массив объектов std

Array
(
    [0] => stdClass Object
        (
            [id] => 545
        )

    [1] => stdClass Object
        (
            [id] => 548
        )

    [2] => stdClass Object
        (
            [id] => 550
        )

    [3] => stdClass Object
        (
            [id] => 552
        )

    [4] => stdClass Object
        (
            [id] => 554
        )

)

Я хочу найти значение ключа [id], используя цикл. У меня есть следующее условие, чтобы проверить, существует ли значение или нет, как показано ниже.

$flag = 1;
if(!in_array($value->id, ???)) {
    $flag = 0;
}

Где ??? я хочу искать в массиве ключа [id] стандартного объекта.

Может ли кто-нибудь помочь мне в этом?


person NullPointer    schedule 22.01.2014    source источник
comment
@Phil, я проверил ссылку, которую вы указали, но я думаю, что решение, которое предоставил Джек, намного лучше.   -  person NullPointer    schedule 22.01.2014
comment
На самом деле это зависит от варианта использования. Например, мой ответ требует больше памяти.   -  person Ja͢ck    schedule 22.01.2014


Ответы (4)


Если массив не слишком велик или тест необходимо выполнять несколько раз, вы можете сопоставить свойства в своем массиве:

$ids = array_map(function($item) {
    return $item->id;
}, $array);

А потом:

if (!in_array($value->id, $ids)) { ... }
person Ja͢ck    schedule 22.01.2014
comment
Это отличный друг (у). Я искал это с давних пор. Еще раз большое спасибо. - person NullPointer; 22.01.2014
comment
Поскольку я могу принять ваш ответ, я приму его и отмечу как решенный. - person NullPointer; 22.01.2014

пытаться:

foreach ($array as $val) {
 if (!in_array($id, (array) $val)) {
 ...
 }
}
person user3222067    schedule 22.01.2014
comment
этот ответ уже дан другим пользователем. - person Alireza Fallah; 22.01.2014
comment
эй это выглядит знакомо .. - person anthonygore; 22.01.2014

Почему бы просто не преобразовать объекты в массивы:

foreach ($array as $a) {
     if (!in_array($id, (array) $a)) {
     ...
     }
}
person anthonygore    schedule 22.01.2014
comment
Я не знаю, почему люди ненавидят простые способы;) - person Alireza Fallah; 22.01.2014

Предполагая, что ваш массив имен $yourArray ,

$newArr = array();
foreach ($yourArray as $key=>$value) {
    $newArr[] = $value->id;
}

А теперь $newArr такой: array(545,548,550,552,554)

И вы можете искать в нем по:

$valueOfSearch = ... ;
$flag = 1;
if(!in_array($valueOfSearch,$newArr)) {
    $flag = 0;
}
person Alireza Fallah    schedule 22.01.2014