2011-03-02 159 views
0

**编辑**如果我只使用数组,例如:PHP - 从多维对象数组中检索min()对象

阵列( 阵列( '姓名'=> '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 
     ) 

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

+0

“如果我只使用数组会发生什么?” - 你可以array_multisort(http://au2.php.net/manual/en/function.array-multisort.php)。但它不会在这种情况下的错误差异,因为你可以只使用array_walk – xzyfer 2011-03-02 11:18:59

+1

你不需要键入“请投我的问题” – dynamic 2011-03-02 11:19:32

+0

我会说这个问题已经设法搅动一个很好的辩论,那是所有。我已经删除了,对不起 – Garbit 2011-03-02 11:21:36

回答

8

嗯了PHP> = 5.3我会尝试这样的事:

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

对于PHP < 5.3 fillowing就足够了:

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

这就是你所说的简洁:) – Garbit 2011-03-02 11:18:40

+0

谢谢,小,但有效。 – RobertPitt 2011-03-02 11:21:26

+0

+1这就是我所要做的,愚蠢的我忘了array_reduce。仅供参考,他想要返回该对象。 – xzyfer 2011-03-02 11:22:43

0

您不能扁化这个,因为它不是一个普通的旧的多维数组,只有值。

这应该工作:

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

哪个对象具有最小值?你没有得到它 - 只是最小的价值。 – hsz 2011-03-02 11:08:43

+0

谢谢,我修复了它。 – 2011-03-02 11:09:03

+0

如果我没有使用对象,只是有一个巨大的数组会更容易吗?只有使用大数组才能解决的问题是它有点怪异。我使用另一个循环的唯一问题是我已经在O(n^2),这将是巨大的,如果我换一个循环在那里 – Garbit 2011-03-02 11:11:14

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']

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

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

3

以前建议的答案没有解释需要包含$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 < 5.3需要类似的初始值才能指定为array_reduce()

+0

如果你正在寻找array_reduce在未排序数组中的最小值,我认为你有可能得不到最小值? – Dalius 2013-08-06 14:10:40