PHP - 从多维对象数组中检索min()对象

时间:2011-03-02 11:03:06

标签: php arrays object multidimensional-array

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

阵列(       array('name'=>'bla','distance'=>'123');       array('name'=>'b123a','distance'=>'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

的对象

6 个答案:

答案 0 :(得分:9)

Hmm for PHP> = 5.3我会尝试这样的事情:

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

对于PHP&lt; 5.3填充就足够了:

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

答案 1 :(得分:4)

之前建议的答案并未解释是否需要在$initial中加入array_reduce()值。该解决方案因此无效。

这个适用于我(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&lt; 5.3需要将类似的初始值指定为array_reduce()

答案 2 :(得分:0)

你不能将它弄平,因为它不是只有值的普通旧多维数组。

这应该有效:

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

答案 3 :(得分:0)

$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->distance更改为$obj['distance']

答案 4 :(得分:0)

此示例应该为您提供正确方向的提示:

<?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 :(得分:0)

尝试:

$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是私有的。因此,您希望能够使用->直接从对象访问它们。你需要某种吸气剂getDistance()