Php 我应该使用哪种方法从一个巨大的响应中提取一个属性?

Php 我应该使用哪种方法从一个巨大的响应中提取一个属性?,php,loops,php-7,Php,Loops,Php 7,我有一个JSON响应,如下所示。打印结果的示例如下所示 ( [0] => stdClass Object ( [name] => Venezuela (Bolivarian Republic of) [topLevelDomain] => Array ( [0] => .ve ) [alpha2Code] => VE [alpha3Code] => VEN [ca

我有一个JSON响应,如下所示。打印结果的示例如下所示

(
[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); 

哪一个是最好的选择?为什么

根据我的研究,您应该使用foreach来提取属性

虽然foreach处理大量的百万条记录要比array\u map快得多

每小时:0.7秒 函数名上的映射:1.2秒
更多信息请参见

我只需使用一个简单的foreach循环即可:

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

foreach ($arr as $name) {
    array_push($nameArr, $name->name);
}

我使用了这个脚本,生成了一个包含500000个寄存器的数组/json:

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

带数组_列的时间:7.5789909362793

与foreach的时间:6.3916020393372

阵列映射时间:7.6288249492645

因此,对于最快的方法,foreach、array\u column和array\u map方法的速度要慢得多。但是,使用100000个寄存器运行时,差异最小:

用于循环的时间:0.40081810951233

带数组_列的时间:0.40819096565247

使用foreach的时间:0.4412341117858589

阵列映射时间:0.58325409889221


不管怎样,还是用吧,这样会更快。

我想你应该用数组映射的方式,它看起来更简洁明了code@Curious_MInd,性能如何?是否有其他方法可以达到相同的效果?您也可以使用array_列来实现此目的。有人发布了一个答案,并出于某种原因删除了它,但它也应该起作用。它们都差不多,只是随便你喜欢哪一种。没有通用的方法。如果您自己执行请求,那么处理大型响应的最佳方法可能是将请求放入临时文件,并使用一些过滤JSON文件解析器,而无需将整个内容加载到内存中。最好是在每次发生时回调,并立即处理一小段数据。也可以在循环中实现。您没有提到您是否关注高性能方式或轻量级资源消耗或其他方面。原因是array_map对数组中的每个元素进行函数调用。