计算对象数组中某一列的唯一值

问题描述 投票:0回答:2

我想在多维数组中计算一个 id 有多少个。 在这种情况下,id 将是播放列表中的用户名。

背景故事:我从 Spotify API 获取信息,我想计算哪个用户在协作播放列表中添加了最多歌曲。我到达了从播放列表中获取所有信息的部分。

这是我的结果

(
[added_at] => 2018-07-30T14:24:24Z
[added_by] => stdClass Object
    (
        [external_urls] => stdClass Object
            (
                [spotify] => https://open.spotify.com/user/ina-78
            )

        [href] => https://api.spotify.com/v1/users/ina-78
        [id] => ina-78
        [type] => user
        [uri] => spotify:user:ina-78
)

来自

for ($i=0; $i < $total; $i++) { 
            Dump::preattyDump($content[$i]);
}

还有 2000 个这样的。

从逻辑上讲,ID 并不总是相同的。 那么,最好的(或任何)方法是如何做到这一点的,因为我无法弄清楚这一点..

这个我就知道了

$users = $content[$i]->added_by->id;

我可以获取所有用户,但只能获取用户。

但是我仍然需要计算所有用户(6)的总数。

这是我的全部代码:

do {
        $response = $api->getPlaylistTracks($playlistId, [
            'offset' => $offset,
        ]);

        $offset += 100;
        $tracks = array_merge($tracks, $response->items);
        $hasNext = $response->next;

    } while ($hasNext);

    $content = [];

    foreach ($tracks as $key => $track){
        $content[] = $track;
    }

    $total = count($content);

    for ($i=0; $i < $total; $i++) { 
        $content[$i]->added_by->id;
    }
php arrays multidimensional-array count
2个回答
3
投票

创建所有 ID 的数组,然后使用

array_count_values()
获取每个 ID 的计数。

$ids = [];
foreach ($content as $e) {
    $ids[] = $e->added_by->id;
}
$counts = array_count_values($ids);
print_r($counts);

array_count_values
接受一个可能包含重复值的数组,并返回一个关联值,其键是这些值,值是重复计数。所以:

array_count_values(['ina-78', 'ina-100', 'ina-78', 'ina-102', 'ina-102'])

产生:

['ina-78' => 2, 'ina-100' => 1, 'ina-102' => 2]

2
投票

使用数组列。

基本思路是这样的:

[['id'=>1],['id'=>2]]

count(array_column($array, 'id'));

它的作用是 array_column,用

id
吸出所有内容,所以我们对这个数组进行计数
[1,2]

看起来

added_by
是一个嵌套对象。所以你可以这样做:

$json = '[{
    "added_at" : "2018-07-30T14:24:24Z",
    "added_by" : {
       "href" : "https://api.spotify.com/v1/users/ina-78",
        "id" : "ina-78",
        "type" : "user",
        "uri" : "spotify:user:ina-78"
}},{
    "added_at" : "2018-07-30T14:24:24Z",
    "added_by" : {
       "href" : "https://api.spotify.com/v1/users/ina-78",
        "id" : "ina-78",
        "type" : "user",
        "uri" : "spotify:user:ina-78"
}}]';

$added_by = array_column($array, 'added_by');
print_r($added_by);
$ids = array_column($added_by, 'id');
print_r($ids);
//or as a single line - we can replace $added_by with array_column($array, 'added_by')
//$ids = array_column(array_column($array, 'added_by'), 'id');

输出(请注意,对我来说,将数据处理为 JSON 更容易,这仅用于示例目的,因为我无法使用 API)

 //$added_by = array_column($array, 'added_by');
Array
(
    [0] => stdClass Object
        (
            [href] => https://api.spotify.com/v1/users/ina-78
            [id] => ina-78
            [type] => user
            [uri] => spotify:user:ina-78
        )

    [1] => stdClass Object
        (
            [href] => https://api.spotify.com/v1/users/ina-78
            [id] => ina-78
            [type] => user
            [uri] => spotify:user:ina-78
        )

)
//$ids = array_column($added_by, 'id');
Array
(
    [0] => ina-78
    [1] => ina-78
)

首先我们从父数组中获取

added_by
,然后从该数据集中获取 ID。基本上我们将数组展开在一列上。现在我们有了一个漂亮整洁的数组可以使用,我们可以在其上使用任何标准数组函数,例如
count
array_count_values

 count($ids); //2
 array_count_values($ids); //['ina-78'=>2]

等等

array_column() 返回输入的单列中的值,由 column_key 标识。或者,可以提供一个index_key,以便通过输入数组的index_key 列中的值对返回数组中的值进行索引。

http://php.net/manual/en/function.array-column.php

将它们放在一起,我们可以在一行中完成这一切,并跳过一堆无用的局部变量污染我们的空间:

统计总ID(带计数)

echo "\n".count(array_column(array_column($array, 'added_by'), 'id'))."\n";

输出

2

沙盒

计算每个ID(使用array_count_values)

例如:

print_r(array_count_values(array_column(array_column($array, 'added_by'), 'id')));

输出:

//count of each id
Array
(
    [ina-78] => 2
    //[ina-79] => 1 - for example
)

沙盒

最后一点

因为我无法知道其中包含什么,因为它不包含在内。我只是假设它是一个数组。

这是我的结果

 /*
  What is this
  Array or
  stdClass Object ?
 */
(
[added_at] => 2018-07-30T14:24:24Z
[added_by] => stdClass Object
    (
        [external_urls] => stdClass Object
            (
                [spotify] => https://open.spotify.com/user/ina-78
            )

        [href] => https://api.spotify.com/v1/users/ina-78
        [id] => ina-78
        [type] => user
        [uri] => spotify:user:ina-78
)

如果它是一个对象,您可以简单地使用

(array)$object

将对象转换为数组
  print_r(array_count_values(array_column(array_column((array)$array, 'added_by'), 'id')));

希望这是有道理的。

© www.soinside.com 2019 - 2024. All rights reserved.