2009-08-28 22 views
8

tengo una matriz en este formato:PHP recuperar los valores mínimo y máximo en una matriz asociativa 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 
     ) 

) 

¿Hay una buena manera de recuperar los valores máximos de 'contar' y mínimo? Podría hacer esto usando algunos bucles, pero pensé que podría haber una mejor manera.

+0

+1 Me encontré con este problema hoy y acabo de hacer un ciclo. Curioso sobre qué otros métodos hay. – MitMaro

+0

Si hay alguna función que lo haga, se implementará con bucles, entonces ¿qué tiene de malo usar sus propias funciones? –

+0

@Svetlozar Angelov: para las funciones de PHP, los bucles se escribirán en C, no en PHP, por lo que generalmente son más rápidos. –

Respuesta

6

a diferencia de lo que otros han publicado, no puede utilizar las funciones min()/max() para este problema, ya que estas funciones no entienden la estructura de datos (matriz) que se aprobó en. estas únicas funciones trabajo para elementos de matriz escalar.


COMENZAR EDITAR

La razón por la cual el uso de min() y max() parece dar la respuesta correcta está relacionado con el tipo de fundición matrices de números enteros que es un undefined behaviour:

El comportamiento de la conversión a entero no está definido para otras t ypes. No confíe en cualquier comportamiento observado, ya que puede cambiar sin previo aviso.

Mi declaración anterior sobre el tipo de fundición fue incorrecta. En realidad, min() y max() funcionan con arreglos pero no de la forma en que el OP los necesita para funcionar. Al utilizar min() y max() con múltiples matrices o una matriz de elementos de matrices son elemento por elemento comparación de izquierda a derecha:

$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 
*/ 

Traducido al problema de la OP Esto muestra la razón por la cual el uso directo de min() y max() parece produce el resultado correcto.Los primeros elementos de arrays' son los id-valores, por lo tanto, min() y max() los compararemos primera, por cierto que resulta en el resultado correcto, porque el más bajo id es el que tiene el más bajo y el más alto countid es el que tiene la más alta count.

FIN EDITAR


La forma correcta sería utilizar un bucle.

$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

Desde la página del manual para max '$ val = max (array (2, 4, 8), array (2, 5, 7)); // array (2, 5, 7) '. Léelo. – MitMaro

+0

Su respuesta es la correcta, aunque no por el motivo que usted indicó. 'min' y' max' manejan las matrices correctamente y no las convierten en enteros, el manual proporciona más detalles. – MitMaro

+0

@MitMaro: tiene razón: mi suposición o razonamiento sobre el uso de matrices en min() y max() era incorrecto. Edité mi respuesta y eliminé la declaración incorrecta. –

0

Puede usar las funciones max() y min().

+1

+1 porque esto me lleva a mi respuesta. – MitMaro

0

Puede usar las funciones max/min ya que devolverán una matriz que contiene el máximo/mínimo de cada índice. Su ejemplo debe devolver array(189, 'Networking ', 48) para max. Podrías agarrar el conteo de esa matriz.


Actualizar esto no funciona como lo había previsto. El ejemplo de la página del manual es engañoso y el ejemplo sobre el resultado correcto utiliza el máximo, pero eso es solo una coincidencia.

+1

Para ser más específico, devolverá las claves correctamente asignadas también, por lo que puede hacer 'max ($ array) ['count']' y 'min ($ array) ['count']' – Amber

+1

Dav: I obtener un error de análisis cuando intento eso. Quizás pienses en Python. – MitMaro

+0

¡Quizás debería volver a leer la pregunta MitMaro! : P –

0

¿Qué hiciste con algunos bucles? Una de ellas es más que suficiente :)

  1. obtener el primer elemento, assing la cuenta a la vez $ min y max
  2. iterate $ sobre el resto, comparar cuentan entre $ $ min y max, si es menor/mayor, asignar el nuevo valor de contaje
0

Parece que no se puede usar max() en una matriz 2D. Simplemente devuelve la matriz más grande, no el máximo() de cada índice (como se menciona en algunas respuestas).

Así:

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

¿Hay un equivalente construir-en función para que uno? (incluso sin el prueba capacidad)

 
/** 
* 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

Si la columna deseada es primero en la matriz se pueden utilizar los siguientes de una sola línea:

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

Esto encontrará el min/max de id

Cuestiones relacionadas