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

У меня есть ответ 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);

Какой будет лучшим выбором и почему?

-1

Решение

Я использовал этот скрипт, генерируя массив / json с 500 000 регистров:

<?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;

И вывод

Время с для цикла: 2.0891849994659

Время с array_column: 7.5789909362793

Время с foreach: 6.3916020393372

Время с массивом: 7.6288249492645

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

Время с для цикла: 0.40081810951233

Время с array_column: 0,40819096565247

Время с foreach: 0.44123411178589

Время с array_map: 0.58325409889221

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

0

Другие решения

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

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

  • Foreach: 0,7 с
  • Карта по имени функции: 1,2 сек.

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

1

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

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

foreach ($arr as $name) {
array_push($nameArr, $name->name);
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector