【问题标题】:PHP - Retrieve min() object from multidimentional object arrayPHP - 从多维对象数组中检索一个()对象
【发布时间】:2011-07-07 04:43:33
【问题描述】:

** 编辑 ** 如果我只使用数组会发生什么,例如

数组( 数组('名称' => 'bla','距离' => '123'); 数组('名称' => 'b123a', '距离' => '1234214'); );

这样会更容易找到最小值吗?

您好,我正在尝试从对象数组中检索距离值最低的对象。这是我下面的数据集;

    [0] => myObjectThing Object
        (
            [name:myObjectThing:private] => asadasd
            [distance:myObjectThinge:private] => 0.9826368952306
        )

    [1] => myObjectThing Object
        (
            [name:myObjectThing:private] => 214gerwert24
            [distance:myObjectThinge:private] => 1.5212312547306
        )

    [2] => myObjectThing Object
        (
            [name:myObjectThing:private] => abc123
            [distance:myObjectThinge:private] => 0.0000368952306
        )

所以我希望能够检索具有最小距离值的对象。在这种情况下,它将是具有名称的对象:abc123

【问题讨论】:

  • "如果我只使用数组会发生什么?" - 然后你可以 array_multisort (au2.php.net/manual/en/function.array-multisort.php)。但在这种情况下它不会产生错误,因为您可以使用 array_walk
  • 你不需要输入“请投票给我的问题”
  • 我想说这个问题已经成功地引发了一场很好的辩论,仅此而已。我现在已经删除了,抱歉

标签: php arrays object multidimensional-array


【解决方案1】:

嗯,对于 PHP >= 5.3 我会尝试这样的:

$Object = array_reduce($data,function($A,$B){
    return $A->distance < $B->distance ? $A : $B;
})

对于 PHP

function user_defined_reduce($A,$B){
    return $A->distance < $B->distance ? $A : $B;
}
$Object = array_reduce($data,"user_defined_reduce");

【讨论】:

  • 这就是你所说的简洁:)
  • +1 这就是我想要的,愚蠢的我忘了array_reduce。仅供参考,他想归还对象。
  • 仅适用于 PHP 5.3 及更高版本。想为旧 PHP 添加版本吗?
  • 添加了 PHP
【解决方案2】:

以前建议的答案没有说明需要在array_reduce() 中包含$initial 值。因此解决方案不起作用。

这个对我有用(PHP 5.3.13):

$array = array(
    array(
        'name' => 'something',
        'value' => 56
    ),
    array(
        'name' => 'else',
        'value' => 54
    ),
    array(
        'name' => 'else',
        'value' => 58
    ),
    array(
        'name' => 'else',
        'value' => 78
    )
);
$object = array_reduce($array, function($a, $b){
    return $a['value'] < $b['value'] ? $a : $b;
}, array_shift($array));

print_r($object);

这会给我:

[0] => Array
(
    [name] => else
    [value] => 54
)

而之前的解决方案给了我null。我假设 PHP array_reduce() 指定类似的初始值。

【讨论】:

  • 如果您在未排序的数组中使用 array_reduce 寻找最小值,我认为您有可能无法获得最小值?
【解决方案3】:

您不能将其展平,因为它不是一个仅包含值的普通旧多维数组。

这应该可行:

$min = $object[0];
for ($i = 1; $i < count($object); $i++)
    if ($object[$i]['distance'] < $min['distance'])
        $min = $object[$i];

【讨论】:

  • 哪个对象的价值最小?你没有得到它 - 只是最低价值。
  • 谢谢你,我已经修好了。
  • 如果我不使用对象而只是拥有一个庞大的数组,这会更容易吗?用大数组做的唯一问题是它有点hacky。使用另一个循环的唯一问题是我已经在 O(n^2) 处,如果我在其中包装另一个循环,这将是巨大的
  • 是否可以将其集成到您的主循环中以避免超过 O(n)?或者你的主循环不是通过对象?
  • 这是通过另一个数据集,所以我正在为每个元素提取数据,然后再对该数据发出另一个请求。如果我在其中添加另一个循环,我认为这太麻烦了
【解决方案4】:

这个例子应该给你一个正确方向的提示:

<?php

$a = new stdClass();
$a->foo = 2;
$b = new stdClass();
$b->foo = 3;
$c = new stdClass();
$c->foo = 1;

$init = new stdClass();
$init->foo = 1000;

$vals = array( $a, $b, $c );

var_dump(
    array_reduce(
        $vals,
        function ( $x, $y )
        {
            if ( $x->foo < $y->foo )
            {
                return $x;
            }   
            else
            {
                return $y;
            }   
        },  
        $init
    )   
);  

?>

【讨论】:

    【解决方案5】:

    尝试:

    $myObjectCollection = ...;
    $minObject = $myObjectCollection[0]; // or reset($myObjectCollection) if you can't ensure  numeric 0 index
    
    array_walk($myObjectCollection, function($object) use ($minObject) { 
            $minObject = $object->distance < $minObject->distance ? $object : $minObject;
    });
    

    但从你的转储的外观来看。 namedistance 是私有的。因此,您希望能够使用-&gt; 直接从对象访问它们。你需要某种吸气剂getDistance()

    【讨论】:

      【解决方案6】:
      $objectsArray = array(...); // your objects
      $distance     = null;
      $matchedObj   = null;
      
      foreach ( $objectsArray as $obj ) {
         if ( is_null($distance) || ( $obj->distance < $distance ) ) {
            $distance   = $obj->distance;
            $matchedObj = $obj;
         }
      }
      
      var_dump($matchedObj);
      

      AD EDIT:

      如果您将使用数组而不是对象,请将$obj-&gt;distance 更改为$obj['distance']

      【讨论】:

        猜你喜欢
        • 2013-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-24
        • 2020-04-06
        • 2018-11-25
        • 1970-01-01
        相关资源
        最近更新 更多