我想在多维数组中计算一个 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;
}
创建所有 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]
使用数组列。
基本思路是这样的:
[['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')));
希望这是有道理的。