Подсчет и вывод элементов массива?

153
22 марта 2018, 09:39

Всем привет. необходимо вывести отсортированные и объединенные данные нескольких массивов. не знаю как. Суть. от АПИ я получаю от одного до десяти ответов в виде json массивов. Пример массива:

{
        "results": [
        {
            "position": "1",
            "url": "https:\/\/www.pizzahut.com\/",
            "title": null,
            "snippet": "<span>Order pizza online for fast pizza delivery or drop by for carryout. You may also 
\ncontact Pizza Hut and find out about our catering services for your next big event.<\/span>"
        },
        {
            "position": "2",
            "url": "https:\/\/www.dominos.com\/",
            "title": null,
            "snippet": "<span>Domino's Home Page - Domino's Pizza, Order Pizza Online for Delivery - 
\nDominos.com.<\/span>"
        },
            ...
        ]
    }

Массивов в этом массиве 100. И (повторюсь) таких json массивов от одного до десяти. Мне необходимо получить первых десять URL из каждого такого массива и вывести эти URL в таблицу, но вывести так чтоб часто повторяющиеся URL были сверху, а внизу не повторяющиеся. как бы в порядке убывания по повторению. Подскажите, пожалуйста как можно сие реализовать.

Answer 1

Если все правильно понял то так:

$parsedJSONArray = []; // Здесь лежат "таких json массивов от одного до десяти"
$topURL= [];//Здесь будет 
foreach($parsedJSONArray as $parsedJSON){
    //если вы использовали json_decode($jsonResponse)
    $result = $parsedJSON->result;
    // или json_decode($jsonResponse,true)
    $result = $parsedJSON['result']
    foreach($result as $object){
    //если вы использовали json_decode($jsonResponse)
       if (isset($topURL->url)){
           $topURL['url']= $topURL['url']+1;
       }else{
           $topURL[$object->url]=1;
       }
   // или json_decode($jsonResponse,true)
       if (isset($topURL['url'])){
           $topURL['url']= $topURL['url']+1;
       }else{
          $topURL[$object['url']]=1;
       }
}

В итоге в переменной $topURL, будут значения (url=>кол-во)

var_dump $topURL=> array(2) { ["https://www.pizzahut.com/"]=> int(1) ["https://www.dominos.com/"]=> int(1) }

Ну а дальше сортируете и выводите, как душе угодно.

Answer 2

Допустим упрощенные исходные данные выглядят так

$jsonData = [
    ['results' => [
        ['url' => 'google.com'],
        ['url' => 'yandex.ru'],
        ['url' => 'yandex.ru'],
        ['url' => 'yandex.ru'],
        ['url' => 'yandex.ru'],
    ]],
    ['results' => [
        ['url' => 'google.com'],
        ['url' => 'yandex.ru'],
        ['url' => 'yandex.ru'],
        ['url' => 'bing.com'],
        ['url' => 'rambler.ru'],
    ]],
];

Берем первые $topN значений из массивов

$topN = 4;
$top = array_map(function($v) use ($topN){.
               return array_slice($v['results'], 0, $topN);
           }, $jsonData);

сливаем их в один и извлекаем url

$data = array_column(array_merge(...$top), 'url');

Подсчитываем значения и сортируем в порядке убывания частоты.

$data = array_count_values($data);
arsort($data)

на выходе имеем

[yandex.ru] => 5
[google.com] => 2
[bing.com] => 1
READ ALSO
Вызов метода класса по его имени

Вызов метода класса по его имени

Я пытаюсь сделать что-то подобное

185
QTcpSocket + QDataStream

QTcpSocket + QDataStream

Доброго дня! Есть устройство с которого нужно считывать строку в ACSII протокол общения TCP/IPЕсть рабочий код:

196
Чтение логов Win - C++

Чтение логов Win - C++

Необходимо написать программу, которая бы читала лог-файлы ВидовсПроблема в том, что мы этого ещё не учили, а курсовую делать нужно

196