Какой метод мне следует использовать для извлечения одного атрибута из огромного ответа?

У меня есть ответ в формате JSON, показанный ниже. пример результата print_r показан ниже

(
[0] => stdClass Object
(
    [name] => Venezuela (Bolivarian Republic of)
    [topLevelDomain] => Array
        (
            [0] => .ve
        )

    [alpha2Code] => VE
    [alpha3Code] => VEN
    [callingCodes] => Array
        (
            [0] => 58
        )

    [capital] => Caracas
    [cioc] => VEN
),
[1] => stdClass Object
(
    [name] => Venezuela (Bolivarian Republic of)
    [topLevelDomain] => Array
        (
            [0] => .ve
        )

    [alpha2Code] => VE
    [alpha3Code] => VEN
    [callingCodes] => Array
        (
            [0] => 58
        )

    [capital] => Caracas
    [cioc] => VEN
),
[2] => stdClass Object
(
    [name] => Venezuela (Bolivarian Republic of)
    [topLevelDomain] => Array
        (
            [0] => .ve
        )

    [alpha2Code] => VE
    [alpha3Code] => VEN
    [callingCodes] => Array
        (
            [0] => 58
        )

    [capital] => Caracas
    [cioc] => VEN
),
....
)

Я хочу извлечь из ответа только имена.

следует ли использовать цикл по массиву и извлекать каждое имя из каждого объекта в массиве и вставлять его в массив, или мне следует использовать следующий код?

$language = array_map(function($object)
{
    return $object->name; 
}, $jsonReponse); 

Что было бы лучшим выбором и почему?

Я думаю, вам стоит пойти с array_map (), так как он кажется более чистым и лаконичным.

Always Sunny 18.12.2018 16:49

@Curious_MInd, как насчет производительности и есть ли другой способ добиться того же результата?

Rafay Hassan 18.12.2018 16:50

Вы также можете использовать для этого array_column. Кто-то опубликовал ответ с этим и по какой-то причине удалил его, но он тоже должен работать. Они все примерно одинаковы, это действительно то, что вам больше нравится.

Don't Panic 18.12.2018 17:46

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

Quasimodo's clone 19.12.2018 12:03

Вы не упомянули, сосредотачиваетесь ли вы на высокой производительности или на легком потреблении ресурсов или на чем-то еще.

Quasimodo's clone 19.12.2018 12:10

Если вы просите «лучшее», вам нужно определить, по какому критерию, иначе это просто запрос мнений, которые были бы не по теме. В любом случае, лучший способ - вообще не строить массив, а отдавать различные элементы для дальнейшего использования.

Ulrich Eckhardt 26.12.2018 18:25
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
6
110
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Согласно моим исследованиям, вы должны использовать foreach () для извлечения атрибута,

при обработке огромного массива из миллионов записей foreach намного быстрее, чем array_map ()

  • Продолжительность: 0,7 сек.
  • Карта по имени функции: 1,2 сек.

Для получения дополнительной информации следуйте эта ссылка.

Причина этого в том, что array_map вызывает функцию для каждого элемента в массиве.

Nikola R. 27.12.2018 12:44

Я бы просто сделал это с помощью простого цикла foreach:

$nameArr = [];
$arr = json_decode($theObject);

foreach ($arr as $name) {
    array_push($nameArr, $name->name);
}
Ответ принят как подходящий

Я использовал этот скрипт, создав массив / json с 500000 регистров:

<?php
ini_set('memory_limit', '-1');
set_time_limit(0);

for ($i = 0; $i < 500000; $i++) {
    $response[] = [
        'name' => uniqid(),
        'topLevelDomain' => ['ve'],
        'alpha2Code' => 'VE',
        'alpha3Code' => 'VEN',
        'callingCodes' => [58],
        'capital' => 'Caracas',
        'cioc' => 'VEN',
    ];
}
$response = json_encode($response);

//for
$time = microtime(true);
$data = json_decode($response);
$namesFor = [];
for($i = 0, $c = count($data); $i < $c; $i++) {
    $namesFor[] = $data[$i]->name;
}

echo "<br/> Time with for loop: ";
echo microtime(true) - $time;

//array_column
$time = microtime(true);
$data = json_decode($response, true);
$namesArrayColumn = array_column($data, 'name');

echo "<br/> Time with array_column: ";
echo microtime(true) - $time;

//foreach
$time = microtime(true);
$data = json_decode($response);
$namesForeach = [];
foreach($data as $d) {
    $namesForeach[] = $d->name;
}

echo "<br/> Time with foreach: ";
echo microtime(true) - $time;

//array_map
$time = microtime(true);
$data = json_decode($response);
$namesArrayMap = [];
$namesArrayMap = array_map(function($d) {
    return $d->name;
}, $data);

echo "<br/> Time with array_map: ";
echo microtime(true) - $time;

И на выходе

Time with for loop: 2.0891849994659

Time with array_column: 7.5789909362793

Time with foreach: 6.3916020393372

Time with array_map: 7.6288249492645

Итак, for является самым быстрым, методы foreach, array_column и array_map намного медленнее. Но при работе со 100000 регистров разница была минимальной:

Time with for loop: 0.40081810951233

Time with array_column: 0.40819096565247

Time with foreach: 0.44123411178589

Time with array_map: 0.58325409889221

В любом случае, выбирайте for, который всегда будет быстрее.

Другие вопросы по теме