2015-02-06 205 views
2

最小值/最大值我有以下格式的數組:查找二維數組

Array 
(
    [0] => Array 
     (
      [DateTime] => "2013-05-22 14:21:01" 
      [Price] => 102.01 
     ) 
    [1] => Array 
     (
      [DateTime] => "2013-05-23 15:55:01" 
      [Price] => 52.60 
     ) 
    [2] => Array 
     (
      [DateTime] => "2013-05-25 14:23:01" 
      [Price] => 452.25 
     ) 
    ... etc 
) 

我需要發現的Price的最低和最高值。

min只返回他們的關鍵。我也嘗試過max(array_map("max", $data)),但只返回452.25

我必須使用foreach並手動執行嗎?

+1

'max(array_column($ data,'Price'))'會給你最大的價格,但你將無法得到相關的DateTime。 – mpen 2015-02-06 18:21:53

+0

您的預期產量是多少? – qtuan 2015-02-06 18:24:46

+0

我只需要實際的價格。不需要與任何關聯。 – 2015-02-06 18:39:05

回答

8

這裏有一種方法來獲得最大和最小值:

$min = min(array_column($array, 'Price')); 
$max = max(array_column($array, 'Price')); 

要返回嵌套數組的最小值和最大值:

$prices = array_column($array, 'Price'); 
$min_array = $array[array_search(min($prices), $prices)]; 
$max_array = $array[array_search(max($prices), $prices)]; 

既然你可以做每一個行看起來像你正在做的事情:

$min_array = $array[array_search(min($prices = array_column($array, 'Price')), $prices)]; 
$max_array = $array[array_search(max($prices = array_column($array, 'Price')), $prices)]; 

PHP> = 5.5.0需要array_column()或使用PHP Implementation of array_column()

只需使用array_map()得到公正的最小值和最大值:

$min = min(array_map(function($a) { return $a['Price']; }, $array)); 
$max = max(array_map(function($a) { return $a['Price']; }, $array)); 

有可能是一個好array_filter()array_reduce()爲好。

+0

看起來不錯!現在我需要弄清楚如何讓我的EC2實例運行PHP 5.5;)(或者我剛剛拿到了你鏈接的實現。) – 2015-02-06 18:40:00

+0

添加了一個替代方案。 – AbraCadaver 2015-02-06 18:48:49

0

我認爲最好的方法(最簡單的方法)是從您的數組中獲取所有價格並將其存儲在單獨的數組中。

然後,您從新數組中提取最大值。

試試這個:

$myarray = array (array("DateTime" => "2013-05-22 14:21:01", "Price" => 102.01), 
        array("DateTime" => "2013-05-23 15:55:01", "Price" => 52.60), 
        array("DateTime" => "2013-05-25 14:23:01", "Price" => 452.25) 
       ); 

//$key is index of $myarray and $value is one of subarrays 
//declare a new array to store all prices 

$all_price = array(); 

foreach ($myarray as $key => $value) 
{ 
    //get only "Price" from each row of array (discard "DateTime") 
    $all_price[] = $value["Price"]; 

} 

//$all_price cointains now all prices and you can get min and max 

$min = min($all_price); 
$max = max($all_price); 

echo("Min: ".$min."<br />"); 
echo("Max: ".$max."<br />"); 

複製和將此代碼粘貼到http://www.writephponline.com/ 看到的結果! :d

作品也PHP低於5.5.0

+0

我編輯了我的答案,因爲我誤解了這個問題。該解決方案已經過測試,非常簡單。你可以在PHP測試器中試用它。我離開的鏈接。 – Yeti82 2015-02-06 23:03:24

0

我喜歡用array_reduce()

$a[]=array('name'=>'kokopiko','price'=>34); 
$a[]=array('name'=>'kokospiko2','price'=>234); 
$a[]=array('name'=>'kokospiko3','price'=>4); 

$minmax = array_reduce($a, function($result, $item) { 

    if (!isset($result['min'])) { 
     $result['min']=$item; 
    } 
    if ($result['min']['price'] > $item['price']) { 
     $result['min']=$item; 
    } 

    if (!isset($result['max'])) { 
     $result['max']=$item; 
    } 
    if ($result['max']['price'] < $item['price']) { 
     $result['max']=$item; 
    } 
    return $result; 
}); 

var_dump($minmax); 

較短版本

$a[]=array('name'=>'kokopiko','price'=>34); 
$a[]=array('name'=>'kokospiko2','price'=>234); 
$a[]=array('name'=>'kokospiko3','price'=>4); 

$init=array('min'=>$a[0],'max'=>$a[0]); 

$minmax = array_reduce($a, function($result, $item) { 
    ($result['min']['price'] < $item['price'])?:$result['min']=$item; 
    ($result['max']['price'] > $item['price'])?:$result['max']=$item; 
    return $result; 
}, $init); 

只有最小/最大值(未相關聯的陣列元素

$min= array_reduce($a, function($result, $item) {return min($result, $item['price']);}, $a[0]['price']); 
$max= array_reduce($a, function($result, $item) {return max($result, $item['price']);}, $a[0]['price']); 
+0

我希望有人會發佈一個,但這是很多代碼。 – AbraCadaver 2015-02-06 23:56:11

+0

我只是想讓它更清楚:)我會添加一個簡短的版本 – user3085707 2015-02-09 16:57:03