繁体   English   中英

PHP - 计算对象数组中的唯一值

[英]PHP - Count unique in an array of objects

我有一个包含这样的对象的 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
    )
 )

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

我是否需要将对象转换为数组,或者是否可以使用当前格式的数据进行转换?

https://www.php.net/manual/en/function.array-column.php

 Version Description 7.0.0 Added the ability for the input parameter to be an array of objects.

使用 array_column 使用会话列值生成新键。 这有效地删除了重复的键。

代码:(演示

$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, 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代表对象。 要访问 objects 属性,您可以执行$object->session

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM