Подсчет уникальности в массиве объектов

У меня есть массив PHP, который содержит такие объекты, как это

Array
(
[0] => stdClass Object
(
[label] => Test 1
[session] => 2
)

[1] => stdClass Object
(
[label] => Test 2
[session] => 2
)

[2] => stdClass Object
(
[label] => Test 3
[session] => 42
)

[3] => stdClass Object
(
[label] => Test 4
[session] => 9
)
)

Я пытаюсь подсчитать количество уникальных сессий в этом массиве. Я могу сделать это, когда все это массив, но я изо всех сил пытаюсь решить, когда массив содержит объекты.

Нужно ли конвертировать объекты в массивы или есть способ сделать это с данными в их текущем формате?

1

Решение

Используйте array_column для генерации новых ключей, используя значения столбца сеанса. Это эффективно удаляет дубликаты ключей.

Код: (Демо: https://3v4l.org/j1pIJ )

$array = [
(object)['label' => 'Test 1', 'session' => 2],
(object)['label' => 'Test 2', 'session' => 2],
(object)['label' => 'Test 3', 'session' => 42],
(object)['label' => 'Test 4', 'session' => 9],
];
echo sizeof(array_column((array)$array, null, 'session'));

Выход:

3

Или без преобразования в массив (но требует объявления переменной):

foreach ($array as $obj) {
$result[$obj->session] = null;
}
echo sizeof($result);

Оба метода позволяют избежать дополнительного вызова функции array_unique и использовать тот факт, что массивы не могут хранить дубликаты ключей.

1

Другие решения

Я попробовал ваш код и здесь создал пример данных

$comments= array();
$comment = new stdClass;
$comment->label = 'Test 1';
$comment->session = '2';
array_push($comments, $comment);
$comment = new stdClass;
$comment->label = 'Test 2';
$comment->session = '2';
array_push($comments, $comment);
$comment = new stdClass;
$comment->label = 'Test 3';
$comment->session = '42';
array_push($comments, $comment);
$comment = new stdClass;
$comment->label = 'Test 4';
$comment->session = '9';
array_push($comments, $comment);

Вот код, который я пытался получить уникальное значение. таким образом, вы можете получить любое поле уникальное значение

$uniques = array();
foreach ($comments as $obj) {
$uniques[$obj->session] = $obj;
}
echo "<pre>";
print_r($uniques);
echo "</pre>";
1

Вы также можете использовать array_map только сохранить ценность session в массиве, затем используйте array_unique удалить дубликаты записей и, наконец, подсчитывать уникальные предметы.

Если, например, ваша переменная массива называется $array:

$result = array_map(function($x){
return $x->session;
}, $array);

echo count(array_unique($result));

Это приведет к:

3

демонстрация

1

К объекту в массиве можно получить доступ с $array[0] где 0 обозначает объект. Для доступа к свойству объектов вы можете сделать $object->session,

Чтобы просмотреть каждое свойство сеанса объектов, вы можете сделать:

foreach ($array as $object) {
echo $object->session . "<br/>";
}
-2