2010-02-03 4 views
11

J'essaie de sélectionner la valeur maximale pour une clé particulière dans un tableau multidimensionnel. Je vais avoir du mal à « arriver à » la clé en question ...Récupère la valeur maximale d'un élément dans un tableau multidimensionnel?

Ainsi, le tableau (ce qui est beaucoup plus long que ce que je suis de poster ici)

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

    ) 

Je suis en train de trouver la valeur maximale "dnum" sur l'ensemble du tableau, donc dans cet exemple, $ max = 2. Je sais que la fonction max me permet de le faire, mais je ne sais pas comment référencer l'élément dnum sans mettre l'ensemble chose dans une boucle foreach, et si je fais cela, alors max ne serait pas la fonction à utiliser, non?

Donc, je ne peux pas faire exactement cela:

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

est-il un moyen pour moi de le faire sans avoir à recréer le tableau entier?

+0

@Felix Kling: Pourquoi voudriez-vous faire une telle modification de __MINOR__ et réactiver cette question? –

+0

@Pranav: Nettoyage .... tags n'ont pas leur place dans le titre. –

Répondre

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

Cette fonction fonctionnerait correctement si votre plus grand nombre ne sont pas négatifs (négatifs, des tableaux vides, et 0s retournera au maximum 0). Parce que vous utilisez un objet qui peut avoir des propriétés/structures personnalisées, je ne crois pas qu'il y ait vraiment de fonctions "prédéfinies" que vous puissiez utiliser pour l'obtenir. Pourrait aussi bien utiliser une boucle foreach.

Vous ne pouvez vraiment pas sortir d'une boucle foreach, car même les fonctions internes utilisent une boucle foreach, c'est juste derrière la scène.

Une autre solution est

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

En PHP 5.2 la seule façon de le faire est de boucle à travers le réseau.

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

Note: J'ai semé le résultat avec 0 car si toutes les valeurs de Dnum sont alors la solution négative maintenant acceptée produira un résultat incorrect. Vous devez semer le maximum avec quelque chose de sensible.

Sinon, vous pouvez utiliser array_reduce():

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

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

En PHP 5.3+, vous pouvez utiliser une fonction anonyme:

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

Vous pouvez utiliser array_map() aussi:

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

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

Merde vous et votre utilisation de snytaxes alternatives! (blague) –

+0

+1 Pour l'utilisation de 'max()' :), je vois rarement cela obtenir n'importe quel temps de jeu. – Sampson

+1

Merci pour les différentes options! Je crois que 'array_map' prend ses arguments dans l'autre sens ([doc pertinent] (http://php.net/manual/fr/function.array-map.php)) donc la dernière solution devrait être' $ max = max (array_map ('get_dnum', $ arr)); ' – Robin

4

Le plus simple manière est probablement votre pensée initiale, qui est de boucler votre tableau une fois , Et retirez toutes les dnum clés dans un tableau séparé, puis appelez max() sur ce point:

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

Vous pouvez le faire sans créer un tableau séparé, mais vous finirez par appeler max() beaucoup plus souvent.l'utilisation des performances/mémoire sera différent entre les deux, vous pouvez toujours le benchmark:

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

La seule autre façon, vous pouvez aller à ce sujet serait de trier votre tableau en utilisant usort() et une fonction de tri personnalisée basée sur l'objet dnum propriétés. Cela va probablement être beaucoup plus lent que simplement boucler votre tableau, donc je ne pense pas que je le recommanderais à moins que vous ayez besoin du tableau trié comme effet secondaire.

+0

Wow, sévèrement battu au punch. Je dois passer moins de temps à taper. : D – zombat

+0

+1 Je connais le sentiment :) – Sampson

3

Si vous aimez

Citations
$max = max(array_map(function($row){ return $row->dnum; }, $myarray)); 
Questions connexes