2010-02-03 5 views
11

Estoy tratando de seleccionar el valor máximo para una clave en particular en una matriz multidimensional. Tengo problemas para "llegar a" la clave en cuestión ...Obtener el valor máximo de un elemento en una matriz multidimensional?

Por lo tanto, la matriz (que es mucho más larga de lo que estoy publicar aquí)

[0] => stdClass Object 
    (
     [id] => 70 
     [cust] => 4 
     [dnum] => 1 
     [upper] => Array 
      (
       [0] => 66 
      ) 

    ) 
[1] => stdClass Object 
    (
     [id] => 43 
     [cust] => 42 
     [dnum] => 2 
     [upper] => Array 
      (
       [0] => 77 
      ) 

    ) 
[2] => stdClass Object 
    (
     [id] => 12 
     [cust] => 3 
     [dnum] => 0 
     [upper] => Array 
      (
       [0] => 99 
      ) 

    ) 

Estoy intentando encuentre el máximo valor "dnum" en toda la matriz, por lo que en este ejemplo, $ max = 2. Sé que la función max me permite hacer esto, pero no estoy seguro de cómo hacer referencia al elemento dnum sin poner el conjunto cosa en un bucle foreach, y si hago eso, entonces max no sería la función a usar, ¿verdad?

Por lo tanto, no puedo hacer esto exactamente:

$max = max($myarray[]->dnum); 

¿Hay alguna manera de hacer esto sin tener que recrear toda la matriz?

+0

@Felix Kling: ¿por qué te hacer una __MINOR__ tales editar y volver a activar esta pregunta? –

+0

@Pranav: Limpiar .... las etiquetas no pertenecen al título. –

Respuesta

10
$max = 0; 
foreach($array as $obj) 
{ 
    if($obj->dnum > $max) 
    { 
     $max = $obj->dnum; 
    } 
} 

Esa función podría funcionar correctamente si el número mayor, no es negativos (negativos, matrices vacías, y 0s volverá al máximo como 0).

Como está utilizando un objeto, que puede tener propiedades/estructuras personalizadas, no creo que existan funciones "predefinidas" que pueda utilizar para obtenerlo. Bien podría usar un bucle foreach.

Realmente no puede alejarse de un bucle foreach, ya que incluso las funciones internas utilizan un bucle foreach, es solo detrás de las escenas.

Otra solución es

$numbers = array(); 
foreach($array as $obj) 
{ 
    $numbers[] = $obj->dnum; 
} 
$max = max($numbers); 
21

En PHP 5.2 la única manera de hacer esto es colocar a través de la matriz.

$max = null; 
foreach ($arr as $item) { 
    $max = $max === null ? $item->dnum : max($max, $item->dnum); 
} 

Nota: He sembrado la consecuencia con 0 porque si todos los valores son negativos dnum entonces la solución ahora aceptado producirá un resultado incorrecto. Necesitas sembrar el máximo con algo sensato.

Como alternativa puede usar array_reduce():

$max = array_reduce($arr, 'max_dnum', -9999999); 

function max_denum($v, $w) { 
    return max($v, $w->dnum); 
} 

En PHP 5.3+ puede utilizar una función anónima:

$max = array_reduce($arr, function($v, $w) { 
    return max($v, $w->dnum); 
}, -9999999); 

Puede utilizar también array_map():

function get_dnum($a) { 
    return $a->dnum; 
} 

$max = max(array_map('get_dnum', $arr)); 
+0

¡Maldito seas y tu uso de snytaxes alternativos! (es broma) –

+0

+1 Para usar 'max()' :) rara vez veo que tenga tiempo para jugar. – Sampson

+1

¡Gracias por las diferentes opciones! Creo que 'array_map' toma sus argumentos al revés ([doc relevante] (http://php.net/manual/en/function.array-map.php)) por lo que la última solución debe ser' $ max = max (array_map ('get_dnum', $ arr)); ' – Robin

4

El más simple es probablemente tu pensamiento inicial, que es repetir tu matriz una vez Y extraiga todas las llaves dnum en una matriz separada, a continuación, llamar max() en que:

$out = array(); 
foreach($myarray as $obj) { 
    $out[] = $obj->dnum; 
} 
echo max($out); 

que podría hacerlo sin crear una matriz separada, sino que va a terminar llamando max() mucho más a menudo.el uso de rendimiento/memoria será diferente entre los dos, siempre se puede benchmark:

$first = $myarray[0]; //assume zero start index 
$max = $first->dnum; 
foreach($myarray as $obj) { 
    $max = max($max,$obj->dnum); 
} 
echo $max; 

La única forma en que podría ir al respecto sería la de ordenar la matriz mediante usort() y una función de clasificación personalizada basada en el objeto dnum propiedades. Sin embargo, esto probablemente sea mucho más lento que simplemente hacer un bucle en tu matriz, así que no creo que lo recomiende a menos que necesites la matriz ordenada como un efecto secundario.

+0

Guau, latió severamente al golpe. Necesito pasar mucho menos tiempo escribiendo. : D – zombat

+0

+1 Sé la sensación :) – Sampson

3

Si te gusta oneliners

$max = max(array_map(function($row){ return $row->dnum; }, $myarray)); 
Cuestiones relacionadas