2009-08-28 113 views
8

我有一個數組的格式如下:PHP檢索最小值和最大值在2D關聯數組

Array 
(
    [0] => Array 
     (
      [id] => 117 
      [name] => Networking 
      [count] => 16 
     ) 

    [1] => Array 
     (
      [id] => 188 
      [name] => FTP 
      [count] => 23 
     ) 

    [2] => Array 
     (
      [id] => 189 
      [name] => Internet 
      [count] => 48 
     ) 

) 

有檢索的最小和「計數」的最大值的好辦法?我可以使用幾個循環來做到這一點,但我認爲可能有更好的方法。

+0

+1我今天遇到這個問題,我只是做了一個循環。對其他方法有好奇。 – MitMaro 2009-08-28 06:22:23

+0

如果有一些功能可以做到這一點,它將用循環來實現,那麼使用你自己的函數有什麼不好?! – 2009-08-28 06:25:46

+0

@Svetlozar Angelov:對於PHP函數,循環將用C編寫,而不是PHP,所以它們通常更快。 – 2009-08-28 08:21:59

回答

6

不同於別人已經公佈,因爲這些功能不明白這是在傳遞的數據結構(陣列),你不能使用min()/max()功能這一問題。只有這些功能爲標量數組元素工作。


BEGIN編輯

之所以使用min()max()似乎得到正確答案的類型轉換陣列整數涉及這是一個undefined behaviour

轉換爲整數 的行爲未定義爲其他t YPES。不要 依賴任何觀察到的行爲,因爲它可以改變,恕不另行通知。

我上面關於類型轉換的說法是錯誤的。實際上min()max()可以處理數組,但不是OP需要它們工作的方式。當使用min()max()與多個陣列或數組元素的數組進行比較逐個元素從左至右依次爲:

$val = min(array(2, 4, 8), array(2, 5, 1)); // array(2, 4, 8) 
/* 
* first element compared to first element: 2 == 2 
* second element compared to second element: 4 < 5 
* first array is considered the min and is returned 
*/ 

翻譯成OP的問題,這說明了爲什麼直接用min()max()似乎理由產生正確的結果。陣列的第一個元素是id - 值,因此min()max()將首先對它們進行比較,捎帶導致正確的結果,因爲最低id是具有最低count和最高id是具有最高count

編輯完


正確的方法是使用一個循環。

$a = array(
     array('id' => 117, 'name' => 'Networking', 'count' => 16), 
     array('id' => 188, 'name' => 'FTP', 'count' => 23), 
     array('id' => 189, 'name' => 'Internet', 'count' => 48) 
); 
$min = PHP_INT_MAX; 
$max = 0; 
foreach ($a as $i) { 
    $min = min($min, $i['count']); 
    $max = max($max, $i['count']); 
} 
+0

從max'$ val = max(array(2,4,8),array(2,5,7))的手冊頁; //數組(2,5,7)'。閱讀。 – MitMaro 2009-08-28 07:52:59

+0

你的回答是正確的,但不是你說的原因。 'min'和'max'確實正確處理數組,並且不會將它們轉換爲整數,本手冊給出了更多細節。 – MitMaro 2009-08-28 08:05:00

+0

@MitMaro:你是對的 - 我在min()和max()中使用數組的假設或推理是錯誤的。我編輯了我的答案並刪除了錯誤的陳述。 – 2009-08-28 08:21:09

0

您可以使用max()min()函數。

+1

+1因爲這導致我的答案。 – MitMaro 2009-08-28 06:38:45

0

您可以使用max/min函數,因爲它們將返回包含每個索引的最大值/最小值的數組。你的例子應該返回array(189, 'Networking ', 48)max。然後你可以從該數組中獲取計數。


更新此功能不起作用,因爲我除外。手冊頁的例子是有誤導性的,關於使用max給出正確的結果的例子,這只是一個巧合。

+1

更具體地說,它實際上會返回正確映射的密鑰 - 所以你可以做'max($ array)['count']'和'min($ array)['count']' – Amber 2009-08-28 06:29:55

+1

Dav:I當我嘗試的時候得到一個解析錯誤。也許你對Python的想法。 – MitMaro 2009-08-28 06:34:33

+0

也許你應該重新閱讀MitMaro的問題! :P – 2009-08-28 06:35:46

0

你用幾個循環做了什麼?一個是很夠:)

  1. 獲取的第一要素,assing計數既$ min和$最大
  2. 遍歷休息,比較計算每個$ min和$最大,如果小/大,分配新的計數值
0

看起來你不能在二維數組上使用max()。它只是返回最大的數組,而不是每個索引的max()(正如在幾個答案中提到的那樣)。

所以:

$count = array(); 
foreach($arr as $_arr) { 
    $count[] = $_arr['count']; 
} 
var_dump(max($count), min($count)); 
0

是否有一個相當於內建功能,那一個? (即使沒有測試能力)

 
/** 
* extracts a column from a 2D array, with an optional selection over another column 
* 
* @param $aArray  array to extract from 
* @param $aColName name of the column to extract, ex. 'O_NAME' 
* @param $aColTest (optional) name of the column to make the test on, ex. 'O_ID' 
* @param $aTest  (optional) string for the test ex. ">= 10", "=='".$toto."'" 
* @return   1D array with only the extracted column 
* @access public 
*/ 

function extractColFromArray($aArray, $aColName, $aColTest="", $aTest="") { 
    $mRes = array(); 
    foreach($aArray as $row) { 
    if (($aColTest == "") || (eval("return " . $row[$aColTest] . $aTest . ";"))) { 
    $mRes[] = $row[$aColName]; 
    } 
    } 
    return $mRes; 
} // extractColFromArray 
0

如果期望的柱是第一則可以使用下面的單行陣列中:

$max = max(array_map('current', $a)); 
$min = min(array_map('current', $a)); 

這將找到的最小/最大ID