Количество повторений каждого поля JSON в массиве php

1

Я хочу получить код для получения списка каждого уникального идентификатора клиента и того, как часто этот идентификатор клиента повторяется через массив.

Ниже приведен фрагмент JSON.

Я хотел бы, если это возможно, на PHP.

Mac 12:12:12:12:12 20 times
Mac 23:23:23:23:23 15 times
Mac 34:34:34:34:34 2 times

Есть ли простой способ сделать это, пожалуйста?

Благодарю.

обкрадывать

"ranges": [
    {
      "clients": [
        {
          "clientId": {
            "mac": "86:8f:c2:8f:c3:20"
          },
          "rssis": [
            {
              "sourceId": "zR1L3",
              "value": -90.4
            }
          ]
        },
        {
          "clientId": {
            "mac": "6c:19:8f:bf:47:e9"
          },
          "rssis": [
            {
              "sourceId": "zR1L3",
              "value": -91.3
            }
          ]
        },
        {
          "clientId": {
            "mac": "58:6d:8f:75:95:0e"
          },
          "rssis": [
            {
              "sourceId": "zR1L3",
              "value": -86.3
            }
          ]
        },
        {
          "clientId": {
            "mac": "68:72:51:10:e7:26"
          },
          "rssis": [
            {
              "sourceId": "zR1L3",
              "value": -53.7
            }
          ]
        },
        {
          "clientId": {
            "mac": "38:2c:4a:5c:b6:a0"
          },
          "rssis": [
            {
              "sourceId": "zR1L3",
              "value": -87.1
            }
          ]
        },
        {
          "clientId": {
            "mac": "68:72:51:10:e7:29"
          },
          "rssis": [
            {
              "sourceId": "zR1L3",
              "value": -76.9
            }
          ]
        },
        {
          "clientId": {
            "uniqueId": "CQos"
          },
          "rssis": [
            {
              "sourceId": "zR1L3",
              "value": -70.2
            }
          ]
        },
        {
          "clientId": {
            "mac": "a4:ee:57:2e:ac:bd"
          },
          "rssis": [
            {
              "sourceId": "zR1L3",
              "value": -95
            }
          ]
        },
        {
          "clientId": {
            "uniqueId": "ECgg"
          },
          "rssis": [
            {
              "sourceId": "zR1L3",
              "value": -75.4
            }
          ]
        },
        {
          "clientId": {
            "mac": "58:6d:8f:74:bf:f9"
          },
          "rssis": [
            {
              "sourceId": "zR1L3",
              "value": -70
            }
          ]
        }
      ],
      "timestamp": "2015-11-09T22:06:00+00:00"
    },
    {
      "clients": [
        {
          "clientId": {
            "mac": "86:8f:c2:8f:c3:20"
          },
          "rssis": [
            {
              "sourceId": "zR1L3",
              "value": -93
            }
          ]
        },
        {
          "clientId": {
            "mac": "6c:19:8f:bf:47:e9"
          },
          "rssis": [
            {
              "sourceId": "zR1L3",
              "value": -90.8
            }
          ]
        },
        {
          "clientId": {
            "mac": "58:6d:8f:75:95:0e"
          },
          "rssis": [
            {
              "sourceId": "zR1L3",
              "value": -87.2
            }
          ]
        },
        {
          "clientId": {
            "mac": "68:72:51:10:e7:26"
          },
          "rssis": [
            {
              "sourceId": "zR1L3",
              "value": -54.1
            }
          ]
        },
        {
          "clientId": {
            "mac": "38:2c:4a:5c:b6:a0"
          },
          "rssis": [
            {
              "sourceId": "zR1L3",
              "value": -87
            }
          ]
        },
        {
          "clientId": {
            "mac": "68:72:51:10:e7:29"
          },
          "rssis": [
            {
              "sourceId": "zR1L3",
              "value": -77.2
            }
          ]
        },
        {
          "clientId": {
            "uniqueId": "CQos"
          },
          "rssis": [
            {
              "sourceId": "zR1L3",
              "value": -70.8
            }
          ]
        },
        {
          "clientId": {
            "mac": "a4:ee:57:2e:ac:bd"
          },
          "rssis": [
            {
              "sourceId": "zR1L3",
              "value": -95
            }
          ]
        },
        {
          "clientId": {
            "uniqueId": "ECgg"
          },
          "rssis": [
            {
              "sourceId": "zR1L3",
              "value": -72.8
            }
          ]
        },
        {
          "clientId": {
            "mac": "58:6d:8f:74:bf:f9"
          },
          "rssis": [
            {
              "sourceId": "zR1L3",
              "value": -70
            }
          ]
        }
      ],
      "timestamp": "2015-11-09T22:07:00+00:00"
    },
  • 0
    Вы должны уточнить свой вопрос. Вы хотите MAC-адрес? Просто граф? Только уникальные? Все они? Вы хотите, чтобы PHP справился с этим?
Теги:
sorting
field

2 ответа

3
Лучший ответ

Сначала запустите json и создайте массив адресов mac:

$data = json_decode($json, true);
$macs = array();

foreach ($data['ranges'] as $range) {
    foreach ($range['clients'] as $client) {
        // check if the client has a mac address, and add it to the array
        if (isset($client['clientId']['mac'])) {
            $macs[] = $client['clientId']['mac'];
        }
    }
}

Затем вы можете просто использовать array_count_values:

var_dump(array_count_values($macs));

Это выведет массив с адресом mac в качестве ключа, а частоту в качестве значения:

array (size=8)
  '86:8f:c2:8f:c3:20' => int 2
  '6c:19:8f:bf:47:e9' => int 2
  '58:6d:8f:75:95:0e' => int 2
  '68:72:51:10:e7:26' => int 2
  '38:2c:4a:5c:b6:a0' => int 2
  '68:72:51:10:e7:29' => int 2
  'a4:ee:57:2e:ac:bd' => int 2
  '58:6d:8f:74:bf:f9' => int 2

Так что вы можете просто сделать

foreach (array_count_values($macs) as $mac => $frequency)
{
    echo "Mac {$mac} {$frequency} times<br/>";
}

Есть и другие способы, например, в цикле вы можете проверить, был ли уже обнаружен Mac, и просто добавьте 1 к счету, когда идете вперед. Но этот способ кажется самым простым.

  • 0
    Brilliant. Большое спасибо @rjdown. Работал отлично.
2

Не уверен в простой способ, но вы можете перебирать данные и хранить результаты в массиве.

//parse json
$data = json_decode( $json );

//store mac addresses
$parsed = array();

foreach( $data['ranges'] as $range ) {
    foreach( $range->clients as $client ) {
        $address = $client->clientId->mac;

        if( ! isset( $parsed[$address] ) )
            $parsed[$address] = 0;

        $parsed[$address]++;
    }
}

//output as requested
foreach( $parsed as $mac => $count )
    echo "Mac {$mac} {$count} <br />";
  • 0
    Очень хорошо. Is if( ! isset( $parsed[$address] ) ) $parsed[$address] = 0; $parsed[$address]++; эквивалентно $parsed[$address] = ++$parsed[$address] || 0; ?
  • 0
    @SalvoF нет, он сгенерирует неопределенное уведомление об индексе и установит значение true ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню