我想在一个多维数组中计算一个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;
}
答案 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。基本上,我们将数组展开为一列。现在我们有了一个很好的整洁数组,可以在其上使用任何标准数组函数,例如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')));
希望如此。