**编辑**如果我只使用数组,会发生什么情况,例如
阵列( 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
的对象答案 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;
});
但是从转储的外观来看。 name
和distance
是私有的。因此,您希望能够使用->
直接从对象访问它们。你需要某种吸气剂getDistance()