1

我有一个 StdClass 对象数组,并希望返回键“price”的最小值的“partner_code”。所以对于这个例子,我想返回 partner_code "AC",因为它是价格最低的合作伙伴。我尝试使用array_reduce,但我不确定我做错了什么。任何帮助,将不胜感激。请注意,我不想对这个数组进行排序。我只想将包含AC(因为它保持最低价格)的子数组移到顶部 - 不按价格对所有内容进行排序

输入数组:

Array
    (
    [0] => stdClass Object
        (
            [name] => Budget
            [partner_code] => BU
            [price] => 365.36
            [tier] => 1
        )

    [1] => stdClass Object
        (
            [name] => Avis
            [partner_code] => AV
            [price] => 449.71
            [tier] => 1
        )

    [2] => stdClass Object
        (
            [name] => E-Z
            [partner_code] => EZ
            [price] => 270.56
            [tier] => 2
        )

    [3] => stdClass Object
        (
            [name] => Sixt
            [partner_code] => SX
            [price] => 280.52
            [tier] => 2
        )

    [4] => stdClass Object
        (
            [name] => Alamo
            [partner_code] => AL
            [price] => 345.13
            [tier] => 2
        )

    [5] => stdClass Object
        (
            [name] => Advantage
            [partner_code] => AD
            [price] => 357.61
            [tier] => 2
        )

    [6] => stdClass Object
        (
            [name] => Enterprise
            [partner_code] => ET
            [price] => 364.46
            [tier] => 2
        )

    [7] => stdClass Object
        (
            [name] => ACE
            [partner_code] => AC
            [price] => 186.53
            [tier] => 3
        )

    [8] => stdClass Object
        (
            [name] => Fox
            [partner_code] => FX
            [price] => 265.25
            [tier] => 3
        )

    [9] => stdClass Object
        (
            [name] => Payless
            [partner_code] => ZA
            [price] => 380.47
            [tier] => 3
        )

    [10] => stdClass Object
        (
            [name] => Dollar
            [partner_code] => ZR
            [price] => 385.99
            [tier] => 3
        )

    [11] => stdClass Object
        (
            [name] => Thrifty
            [partner_code] => ZT
            [price] => 385.99
            [tier] => 3
        )

    [12] => stdClass Object
        (
            [name] => Silvercar
            [partner_code] => SC
            [price] => 424.10
            [tier] => 3
        )

    [13] => stdClass Object
        (
            [name] => National
            [partner_code] => NA
            [price] => 448.82
            [tier] => 3
        )

    [14] => stdClass Object
        (
            [name] => Hertz
            [partner_code] => HZ
            [price] => 487.33
            [tier] => 3
        )
    )

代码:

 array_reduce($this->results->companies, function($a,$b) {
        echo "Prices: " . $a->price . "<br>";
        return $a->price < $b->price ? (string)$a->partner_code : (string)$b->partner_code;
 });
4

3 回答 3

1
usort($array, function($a, $b) {
        return ($a->price - $b->price) ;
});

echo $array[0]->partner_code;
于 2017-09-01T05:14:35.203 回答
0

此方法不会对整个数组进行排序。它将拉出价格最低的子数组并将其设置为第一个元素。我本可以嵌套一些函数以使其更紧凑(1-liner),但这会损害可读性。

代码:(演示

$results=[
    (object)["name"=>"Budget","partner_code"=>"BU","price"=>"365.36","tier"=>"1"],
    (object)["name"=>"Avis","partner_code"=>"AV","price"=>"449.71","tier"=>"1"],
    (object)["name"=>"E-Z","partner_code"=>"EZ","price"=>"270.56","tier"=>"2"],
    (object)["name"=>"Sixt","partner_code"=>"SX","price"=>"280.52","tier"=>"2"],
    (object)["name"=>"Alamo","partner_code"=>"AL","price"=>"345.13","tier"=>"2"],
    (object)["name"=>"Advantage","partner_code"=>"AD","price"=>"357.61","tier"=>"2"],
    (object)["name"=>"Enterprise","partner_code"=>"ET","price"=>"364.46","tier"=>"2"],
    (object)["name"=>"ACE","partner_code"=>"AC","price"=>"186.53","tier"=>"3"],
    (object)["name"=>"Fox","partner_code"=>"FX","price"=>"265.25","tier"=>"3"],
    (object)["name"=>"Payless","partner_code"=>"ZA","price"=>"380.47","tier"=>"3"],
    (object)["name"=>"Dollar","partner_code"=>"ZR","price"=>"385.99","tier"=>"3"],
    (object)["name"=>"Thrifty","partner_code"=>"ZT","price"=>"385.99","tier"=>"3"],
    (object)["name"=>"Silvercar","partner_code"=>"SC","price"=>"424.10","tier"=>"3"],
    (object)["name"=>"National","partner_code"=>"NA","price"=>"448.82","tier"=>"3"],
    (object)["name"=>"Hertz","partner_code"=>"HZ","price"=>"487.33","tier"=>"3"]
];
$min=min(array_column($results,'price'));  // find the minimum value
$index=array_search($min,array_column($results,'price'));  // find the index of the subarray containing min value
$pulled=array_splice($results,$index,1);  // extract the subarray and preserve it as $pulled
$new_results=array_merge($pulled,$results);  // set $pulled as first element
var_export($new_results);

...好的,好的,这是单行: var_export(array_merge(array_splice($results,array_search(min(array_column($results,'price')),array_column($results,'price')),1),$results));

输出:

array (
  0 => 
  stdClass::__set_state(array(
     'name' => 'ACE',
     'partner_code' => 'AC',
     'price' => '186.53',
     'tier' => '3',
  )),
  1 => 
  stdClass::__set_state(array(
     'name' => 'Budget',
     'partner_code' => 'BU',
     'price' => '365.36',
     'tier' => '1',
  )),
  2 => 
  stdClass::__set_state(array(
     'name' => 'Avis',
     'partner_code' => 'AV',
     'price' => '449.71',
     'tier' => '1',
  )),
  3 => 
  stdClass::__set_state(array(
     'name' => 'E-Z',
     'partner_code' => 'EZ',
     'price' => '270.56',
     'tier' => '2',
  )),
  4 => 
  stdClass::__set_state(array(
     'name' => 'Sixt',
     'partner_code' => 'SX',
     'price' => '280.52',
     'tier' => '2',
  )),
  5 => 
  stdClass::__set_state(array(
     'name' => 'Alamo',
     'partner_code' => 'AL',
     'price' => '345.13',
     'tier' => '2',
  )),
  6 => 
  stdClass::__set_state(array(
     'name' => 'Advantage',
     'partner_code' => 'AD',
     'price' => '357.61',
     'tier' => '2',
  )),
  7 => 
  stdClass::__set_state(array(
     'name' => 'Enterprise',
     'partner_code' => 'ET',
     'price' => '364.46',
     'tier' => '2',
  )),
  8 => 
  stdClass::__set_state(array(
     'name' => 'Fox',
     'partner_code' => 'FX',
     'price' => '265.25',
     'tier' => '3',
  )),
  9 => 
  stdClass::__set_state(array(
     'name' => 'Payless',
     'partner_code' => 'ZA',
     'price' => '380.47',
     'tier' => '3',
  )),
  10 => 
  stdClass::__set_state(array(
     'name' => 'Dollar',
     'partner_code' => 'ZR',
     'price' => '385.99',
     'tier' => '3',
  )),
  11 => 
  stdClass::__set_state(array(
     'name' => 'Thrifty',
     'partner_code' => 'ZT',
     'price' => '385.99',
     'tier' => '3',
  )),
  12 => 
  stdClass::__set_state(array(
     'name' => 'Silvercar',
     'partner_code' => 'SC',
     'price' => '424.10',
     'tier' => '3',
  )),
  13 => 
  stdClass::__set_state(array(
     'name' => 'National',
     'partner_code' => 'NA',
     'price' => '448.82',
     'tier' => '3',
  )),
  14 => 
  stdClass::__set_state(array(
     'name' => 'Hertz',
     'partner_code' => 'HZ',
     'price' => '487.33',
     'tier' => '3',
  )),
)

我认为这是一种产生相同/期望结果的更精简的方法:(演示

$min=$results[0]->price;  // set initial/default min value
$index=0; // set initial/default index
foreach($results as $i=>$a){
    if($a->price<$min){  // if a lower price...
        $min=$a->price;  // store new $min
        $index=$i;  // stor new $index
    }
}
$results=array_merge($results,array_splice($results,$index,1));  // extract lowest and move to front of array
var_export($results);
于 2017-09-01T07:33:38.130 回答
0

如果您真的不想对数组进行排序而是使用array_reduce,请通过将数组减少为其元素之一来实现。然后您可以获得该partner_code元素的属性。

例如

array_reduce($this->results->companies, function($lowest, $company) {
    // $lowest will be null on the first iteration
    return $lowest === null || $company->price < $lowest->price ?
        $company : $lowest;
})->partner_code;
于 2017-09-01T05:41:37.087 回答