2009-08-28 185 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