Подсчет из многомерного массива - PullRequest
0 голосов
/ 08 марта 2019

Я хочу посчитать в многопрофильном массиве, сколько из 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 таких.

Логически идентификаторы не всегда одинаковы. Так как бы это был лучший (или любой) способ сделать это, так как я не могу понять суть этого ...

Я знаю с этим

$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 ]

3 голосов
/ 08 марта 2019

Создайте массив всех идентификаторов, затем используйте array_count_values(), чтобы получить количество для каждого идентификатора.

$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 голосов
/ 08 марта 2019

Использовать столбец массива.

Основная идея такова:

[['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 из родительского массива, затем идентификатор из этого набора данных.По сути, мы разворачиваем массив на один столбец.Теперь, когда у нас есть хороший аккуратный массив для работы, мы можем использовать любые стандартные функции массива, такие как 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

Песочница

Подсчет каждого идентификатора (с массивом_значений)

Например:

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

Надеюсь, что это имеет смысл.

...