2010-02-03 11 views
11

Sto provando a selezionare il valore massimo per una particolare chiave in una matrice multidimensionale. Ho problemi "raggiungere" la chiave in questione ...Ottieni il valore massimo da un elemento in un array multidimensionale?

Quindi, la matrice (che è molto più lungo di quello che sto postando qui)

[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 
      ) 

    ) 

sto cercando di trova il massimo valore "dnum" sull'intero array, quindi in questo esempio $ max = 2. So che la funzione max mi consente di farlo, ma non sono sicuro di come fare riferimento all'elemento dnum senza mettere l'intero cosa in un ciclo foreach, e se lo faccio, quindi max non sarebbe la funzione da utilizzare, giusto?

Quindi, non posso fare esattamente questo:

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

Esiste un modo per me di fare questo senza dover ricreare l'intero array?

+0

@Felix Kling: perché si dovrebbe fare una tale modifica __MINOR__ e riattivare questa domanda? –

+0

@Pranav: pulizia .... i tag non appartengono al titolo. –

risposta

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

Tale funzione potrebbe funzionare correttamente se il tuo numero più alto non è negativo (negativi, gli array vuoti, e 0 restituirà il massimo come 0).

Poiché si utilizza un oggetto, che può avere proprietà/strutture personalizzate, non credo che ci siano davvero delle funzioni "predefinite" che è possibile utilizzare per ottenerlo. Potrebbe anche usare un ciclo foreach.

Non riesci davvero ad allontanarti da un ciclo foreach, poiché anche le funzioni interne utilizzano un ciclo foreach, è solo dietro le quinte.

Un'altra soluzione è

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

In PHP 5.2 l'unico modo per farlo è quello di scorrere l'array.

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

Nota: Ho seminato il risultato con 0, perché se tutti i valori sono negativi dnum allora la soluzione ormai accettato produrrà un risultato errato. È necessario seminare il massimo con qualcosa di sensato.

In alternativa è possibile utilizzare array_reduce():

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

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

In PHP 5.3+ è possibile utilizzare una funzione anonima:

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

È possibile utilizzare array_map() troppo:

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

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

Accidenti a te e al tuo uso di snytax alternativi! (scherzando) –

+0

+1 Per l'uso di 'max()' :) Raramente vedo che avere una durata di riproduzione. – Sampson

+1

Grazie per le diverse opzioni! Credo che 'array_map' riprenda i suoi argomenti al contrario ([doc pertinente] (http://php.net/manual/en/function.array-map.php) quindi l'ultima soluzione dovrebbe essere' $ max = max (array_map ('get_dnum', $ arr)); ' – Robin

4

Il più semplice il modo è probabilmente il tuo pensiero iniziale, che è quello di loopare il tuo array una volta , E tirare fuori tutte le chiavi dnum in una matrice separata, quindi chiamare max() su quella:

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

si potesse fare senza creare un array separato, ma si finirà per chiamare max() molto più spesso.utilizzo di prestazioni/memoria sarà diverso tra i due, si potrebbe sempre punto di riferimento è:

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

L'unico altro modo si potrebbe andare a questo proposito sarebbe quello di ordinare l'array utilizzando usort() e una funzione di ordinamento personalizzato in base all'oggetto dnum proprietà. Probabilmente questo sarà molto più lento del semplice loop del tuo array, quindi non penso che lo consiglierei a meno che tu non abbia bisogno dell'array ordinato come effetto collaterale.

+0

Wow, picchia forte al punch. Devo dedicare meno tempo alla digitazione. : D – zombat

+0

+1 Conosco la sensazione :) – Sampson

3

Se ti piace oneliners

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