У меня есть ответ 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);
Какой будет лучшим выбором и почему?
Я использовал этот скрипт, генерируя массив / 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
это будет быстрее всегда.
Согласно моему исследованию вы должны использовать foreach () для извлечения атрибута,
в то время как обработка огромного массива миллионов записей foreach намного быстрее, чем array_map ()
Для получения дополнительной информации следуйте эта ссылка.
Я бы просто сделал это с помощью простого цикла foreach:
$nameArr = [];
$arr = json_decode($theObject);
foreach ($arr as $name) {
array_push($nameArr, $name->name);
}