У меня есть ответ в формате 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);
Что было бы лучшим выбором и почему?
@Curious_MInd, как насчет производительности и есть ли другой способ добиться того же результата?
Вы также можете использовать для этого array_column
. Кто-то опубликовал ответ с этим и по какой-то причине удалил его, но он тоже должен работать. Они все примерно одинаковы, это действительно то, что вам больше нравится.
Общего способа сделать это не существует. Если вы выполняете запрос самостоятельно, вероятно, лучшим подходом к огромным ответам может быть запрос во временный файл и использование некоторого фильтрующего анализатора файлов JSON без загрузки всего содержимого в память. Лучше всего будет обратный вызов при каждом возникновении и немедленная обработка небольшого фрагмента данных. (Также может быть выполнено в цикле.)
Вы не упомянули, сосредотачиваетесь ли вы на высокой производительности или на легком потреблении ресурсов или на чем-то еще.
Если вы просите «лучшее», вам нужно определить, по какому критерию, иначе это просто запрос мнений, которые были бы не по теме. В любом случае, лучший способ - вообще не строить массив, а отдавать различные элементы для дальнейшего использования.
Согласно моим исследованиям, вы должны использовать foreach () для извлечения атрибута,
при обработке огромного массива из миллионов записей foreach намного быстрее, чем array_map ()
Для получения дополнительной информации следуйте эта ссылка.
Причина этого в том, что array_map вызывает функцию для каждого элемента в массиве.
Я бы просто сделал это с помощью простого цикла 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
, который всегда будет быстрее.
Я думаю, вам стоит пойти с array_map (), так как он кажется более чистым и лаконичным.