У меня есть массив 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
)
)
Я пытаюсь подсчитать количество уникальных сессий в этом массиве. Я могу сделать это, когда все это массив, но я изо всех сил пытаюсь решить, когда массив содержит объекты.
Нужно ли конвертировать объекты в массивы или есть способ сделать это с данными в их текущем формате?
Используйте 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
и использовать тот факт, что массивы не могут хранить дубликаты ключей.
Я попробовал ваш код и здесь создал пример данных
$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>";
Вы также можете использовать array_map только сохранить ценность session
в массиве, затем используйте array_unique удалить дубликаты записей и, наконец, подсчитывать уникальные предметы.
Если, например, ваша переменная массива называется $array
:
$result = array_map(function($x){
return $x->session;
}, $array);
echo count(array_unique($result));
Это приведет к:
3
К объекту в массиве можно получить доступ с $array[0]
где 0
обозначает объект. Для доступа к свойству объектов вы можете сделать $object->session
,
Чтобы просмотреть каждое свойство сеанса объектов, вы можете сделать:
foreach ($array as $object) {
echo $object->session . "<br/>";
}