Я помещаю объекты класса в два разных массива, а затем хочу взять разные из этих массивов. Тем не менее, когда я использую массив push с array_udiff, я не могу получить array_udiff для вывода чего-либо, кроме null. Вот скелет кода.
Определение класса:
class follower
{
public $friend;
public $newposts;
}
Назначение данных: для цикла, содержащего:
$holder = new follower();
....put data in $holder....
array_push($object_array1, $holder);
второй цикл делает то же самое …
$holder = new follower();
....put data in $holder....
array_push($object_array2, $holder);
Функция для сравнения объектов в массивах объектов:
function compare_followers($f1, $f2)
{
$s1 = $f1->friend;
$s2 = $f2->friend;
return strcmp($s1, $s2);
}
И, наконец, неудачная попытка сравнить эти два массива (массивы выглядят так, как должны, массивы объектов-последователей)
$object_array = array_udiff($object_array2, $object_array1, 'compare_followers');
$ object_array равен нулю. В дополнение к приведенному выше коду я попытался поиграться с функцией сравнения — сделать ее статической функцией в классе или объявить ее как неназванную функцию в вызове array_udiff, но ни одна из этих вещей не сработала.
Если я применяю compare_followers к отдельным ученикам, это нормально работает. Точно так же, если я помещаю следующий объект в мои $ object_array1 и $ object_array2, array_udiff работает нормально:
$holderA = array(
'friend' =>$holder->friend,
'newposts' => $holder->newposts
);
array_push($object_array2, $holder); (and same for $object_array1)
$object_array = array_udiff($object_array2, $object_array1, 'compare_followers');
Проблема с этим последним рабочим подходом состоит в том, что он дает словарь объектов, а не массив объектов — мне нужен массив.
Вот некоторые вопросы стекового потока, которые актуальны, но не решают эту проблему: array_udiff не работает должным образом, Как работает array_udiff ()?, пересечение массива для массива объектов php.
Вот документация для этого класса (http://php.net/manual/en/function.array-udiff.php
Что я делаю неправильно?
Спасибо за любые предложения.
Попробуй это. Осторожно, что на самом деле содержат массивы.
<?php
class follower {
public $friend;
public $newposts;
public function __construct($friend, $newpost) {
$this->friend = $friend;
$this->newposts = $newpost;
}
}
$object_array1 = array();
$holder = new follower('me', 'first');
array_push($object_array1, $holder);
$object_array2 = array();
$holder = new follower('you', 'second');
array_push($object_array2, $holder);
function compare_followers($f1, $f2) {
$s1 = $f1->friend;
$s2 = $f2->friend;
return strcmp($s1, $s2);
}
$object_array = array_udiff($object_array2, $object_array1, 'compare_followers');
var_dump($object_array);
Других решений пока нет …