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

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

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

Ответы [ 3 ]

0 голосов
/ 27 декабря 2018

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

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

foreach ($arr as $name) {
    array_push($nameArr, $name->name);
}
0 голосов
/ 27 декабря 2018

Я использовал этот скрипт, генерируя массив / 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

Время с array_map: 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 голосов
/ 26 декабря 2018

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

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

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

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

...