2011-03-02 125 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