Об'єкт PHP in_array порівнюється?

Чи може функція in_array порівнювати об'єкти?

Наприклад, у мене є масив об'єктів, і я хочу додати їх явно до іншого масиву. Чи можна перевірити, чи об'єкт уже додано так:

in_array($distinct, $object);

чи є інший спосіб?

11
Так що це буде працювати з об'єктами в масиві?
додано Автор gorgi93, джерело
Яке ваше визначення "чітко"? Якщо "distinct" є протилежним рівності посилань, то просто передача в true як третій параметр зробить це.
додано Автор Jon, джерело
Для деякого визначення "робота". Вам потрібно надати більше подробиць, читання розуму важко.
додано Автор Jon, джерело
Чи допоможе вам відповідь на подібне питання?
додано Автор Furgas, джерело
що означає чіткий, його незрозуміло, що ви хочете.
додано Автор Muhammad, джерело

7 Відповіді

Можна використовувати суворе порівняння:

in_array($object, $array, TRUE);

Приклад використання:

$a = new stdClass();
$a->x = 42;

$b = new stdClass();
$b->y = 42;

$c = new stdClass();
$c->x = 42;

$array = array($a,$b);

echo in_array($a, $array, true);//1
echo in_array($b, $array, true);//1
echo in_array($c, $array, true); //
16
додано

The in_array function cannot compare objects.

Ви повинні створити унікальні пари ключ-значення з ваших об'єктів і лише порівнювати ці ключі при вставці нового об'єкта в кінцевий масив.

Припускаючи, що кожен об'єкт має унікальне властивість id , можливим рішенням буде:

$unique_objects = array();

// $data represents your object collection
foreach ($data as $item) {
    if (!array_key_exists($item->id, $unique_objects)) {
        $unique_objects[$item->id] = $obj;
    }
}
12
додано
Це дійсно працювало ... XD
додано Автор gorgi93, джерело
lol, що? $ idem не є змінною в будь-якому місці, і не є $ obj? Як це проголосувало 13 разів?
додано Автор Kristofer Doman, джерело
Це все ще неправильно.
додано Автор MatTheCat, джерело
Влучне зауваження. Я оновив відповідь, щоб виправити помилку $ idem . Припущення з цим прикладом коду полягає в тому, що $ obj просто представляє існуючу змінну, яку потрібно однозначно додати до масиву $ unique_objects .
додано Автор ukliviu, джерело

See http://php.net/manual/en/function.spl-object-hash.php

if ( ! array_key_exists( spl_object_hash( $obj ), $objects ) ) {
    $objects[ spl_object_hash( $obj ) ] = $obj;
}

Привітання

2
додано

Існує багато способів зробити це, як ви бачите. Я просто думав, що додаду ще один. Я не знаю чому, але при роботі з масивами об'єктів мені подобається використовувати функції масиву, які використовують виклики.

Якщо ваші об'єкти мають будь-який ідентифікатор, який вони повинні мати, якщо ви хочете перевірити їх на дублювання, буде працювати наступне:

$found = array_filter($uniqueObjects, function($uniqueObject) use ($object) {
    return $uniqueObject->id == $object->id
});

if (!$found) {
    $uniqueObjects[] = $object;
}

$object is the object you're looking for, and $uniqueObjects is the array of objects you're searching to see if it exists. Just match uniqueObject and object on an identifying property, such as an id.

1
додано

Я не знаю, чи є це через нову версію PHP, але в моєму проекті, використовуючи PHP 5.3.16 на Ubuntu 12.04, він працював. Він знайшов об'єкт голки в моєму масиві об'єктів. Я також двічі перевірив, завантаживши інший об'єкт того ж класу, і перевірив його на вміст масиву, який не містив цей об'єкт, і він дійсно повернув false.

Так, так, in_array може порівнювати об'єкти.

1
додано

Якщо "STRICT" є "FALSE", порівняння здійснюється шляхом перетворення в рядок елементів. Отже, якщо ви перекриваєте магічну функцію __toString, ви повинні бути доступними для порівняння елементів об'єктів.

0
додано

Я придумав дещо інший, я думаю більш надійний, варіант.

function array_add_unique(&$array, $new, $test, $cb) {
  if(is_array($array) && count($array)>0) {
    for($i = 0; $i < count($array); $i++) {
      if( $array[$i][$test] == $new[$test] ) {
        $do = $cb($array[$i], $new);
        if(is_bool($do) && $do) { $array[$i] = $new; }
        else if(!is_bool($do)) { $array[$i] = $do; }
        return;
      }
    }
  }
  array_push($array, $new);
}

Перевагою цього рішення є те, що він включає в себе користувальницький зворотний виклик для обробки колізій. Коли ви додаєте унікальні об'єкти, ви можете зберегти властивості як від старого, так і від нового об'єкта.

Зворотній виклик, який може бути анонімною функцією, отримує як новий об'єкт, так і існуючий об'єкт, щоб користувач міг мати спеціальний розрахунок. Поверніть true , щоб просто замінити існуючий об'єкт або повернути новий об'єкт (non-bool), щоб замінити його.

Я не знаю продуктивності цього на великих наборів даних, хоча.

0
додано
Ukrainian PHP comunity
Ukrainian PHP comunity
885 учасників

dev-ua/php