从多维数组计数

时间:2019-03-08 20:22:19

标签: php arrays multidimensional-array count

我想在一个多维数组中计算一个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;
    }

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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。基本上,我们将数组展开为一列。现在我们有了一个很好的整洁数组,可以在其上使用任何标准数组函数,例如countarray_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

Sandbox

计算每个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
)

Sandbox

最后一个笔记

因为我没有办法知道其中包含的内容,因为其中没有包含。我只是认为这是一个数组。

  

这是我的结果

 /*
  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')));

希望如此。