PHP - 在对象数组中唯一计数

时间:2018-04-24 10:22:35

标签: php arrays unique counting

我有一个包含这样的对象的PHP数组

INSERT DELAYED

我正在尝试计算此数组中唯一会话的数量。当整个数组是一个数组时,我可以做到,但是当数组包含对象时,我正在努力解决这个问题。

我是否需要将对象转换为数组,或者有一种方法可以使用当前格式的数据吗?

4 个答案:

答案 0 :(得分: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 :(得分: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的额外函数调用,并利用了数组无法存储重复键的事实。

答案 2 :(得分:1)

您还可以使用array_map仅保留数组中session的值,然后使用array_unique删除重复的条目,最后count删除唯一的项目。

例如,如果您的数组变量被称为$array

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

echo count(array_unique($result));

这将导致:

  

3

Demo

答案 3 :(得分:-2)

可以使用0访问数组中的对象,其中$object->session代表对象。要访问objects属性,您可以执行foreach ($array as $object) { echo $object->session . "<br/>"; }

要查看每个对象会话属性,您可以执行以下操作:

{{1}}