2013-05-22 2 views
1

У меня есть 2 PHP массивы, простой:PHP сравнить/дифф массив с массивом объектов

array 
    0 => int 5 
    1 => int 6 

и массив объектов:

array 
    0 => 
    object(stdClass)[43] 
     public 'id' => int 1 
    1 => 
    object(stdClass)[46] 
     public 'id' => int 3 
    2 => 
    object(stdClass)[43] 
     public 'id' => int 5 
    3 => 
    object(stdClass)[46] 
     public 'id' => int 6 
    4 => 
    object(stdClass)[46] 
     public 'id' => int 7 

я хотел бы сделать diff этих 2 массивов для устранения во втором, присутствующих в первом. В этом примере я не хочу, чтобы идентификаторы 5 и 6 во втором массиве. Но мне нужна помощь;>

Спасибо.

Фабьен

+0

какая версия PHP вы качению? –

+0

Версия 5.3.8, но она решена сейчас, спасибо. – feub

ответ

2

Предполагая $objects ваш массив объектов ц, и $values ваш массив значений для удаления ...

Вы можете использовать foreach цикл, если вы хотите вернуть объекты:

$values = array(5, 6); 
$objects = array(
    (object) array("id" => 1), 
    (object) array("id" => 3), 
    (object) array("id" => 5), 
    (object) array("id" => 6), 
    (object) array("id" => 7) 
); 
foreach($objects as $key => $object) { 
    if(in_array($object->id,$values)) { 
     unset($objects[$key]); 
    } 
} 

Live demo (0,008 сек)

Если вы хотите для использования самой функции diff (это возможно, но неудобно, менее читаемо и будет просто возвращать массив значений) вы можете (как предложил Баба) вернуть id объекта inline:

$values = array(5, 6); 
$objects = array(
    (object) array("id" => 1), 
    (object) array("id" => 3), 
    (object) array("id" => 5), 
    (object) array("id" => 6), 
    (object) array("id" => 7) 
); 
$diff = array_diff(array_map(function ($object) { 
    return $object->id; 
}, $objects), $values); 

Live demo (0,008 сек)

+0

Спасибо, Babs Seed, это именно то, что мне нужно. – feub

+0

@feub рад, что я мог бы помочь. –

1

Loop над вторым массивом и использовать in_array метод для проверки существующих значений в первом

$firstArray = array(5, 6); 
foreach ($objects as $key => $object) { 
    if (in_array($object->id, $firstArray)) { 
     unset($objects[$key]; 
    } 
} 
3

Вы можете попробовать:

$diff = array_diff(array_map(function ($v) { 
    return $v->id; 
}, $array2), $array1); 

See Live DEMO

+0

Это не возвращает массив объектов, он возвращает массив. Спасибо за ссылку eval.in, хотя я никогда не видел этот сайт раньше. –

1

Для версий старше 5.3

foreach($arr_2nd as $key => $val ) 
{ 
    $arr_2nd[$key] = $val->id; 
} 

array_diff($arr_1st, $arr_2nd); 
Смежные вопросы