2011-02-10 3 views
0

J'ai un tableau 2D au format:PHP: Valeur minimale dans le tableau 2D

[ 
[1, 23, 20], 
[2, 45, 30], 
[4, 63, 40], 
... 
] 

Je suis en train de rechercher le tableau et le retour des éléments [0] et [1] de la ligne où l'élément [1 ] est le plus bas. J'ai le code suivant pour renvoyer la valeur la plus basse dans [1] mais je ne suis pas sûr comment obtenir l'élément [0] aussi bien.

$min = PHP_INT_MAX; 
foreach ($test as $i) { 
    $min = min($min, $i[1]); 
} 

Dans l'exemple ci-dessus, je reviendrais [1, 23]

Merci,

+0

en général, s'il vous plaît indiquer si php4 ou php5 est utilisé –

Répondre

1

Vous devez utiliser usort pour cela:

usort($test, function($a, $b) { 
    return $a[1] - $b[1]; 
}); 

$min = $test[0]; 

Notez que celui-ci utilise des fonctions anonymes, qui ont été introduites en PHP 5.3. Dans les versions précédentes, vous devez utiliser des fonctions nommées et transmettre le nom sous forme de chaîne à usort.

+0

élégant, mais je me demande si c'est plus rapide. – Hamish

+0

Qui s'en soucie? Il devrait encore prendre du temps linéaire. – erisco

+0

@erisco @lonesomeday: Le tri en PHP utilise QuickSort qui est 'O (n^2)' qui n'est pas linéaire ... Donc, il faudra n fois autant d'opérations qu'un simple appel loop/reduce. Pas un problème pour les petits tableaux, mais potentiellement énorme pour les grands (en particulier en raison des rappels) ... – ircmaxell

0

Cela fera le travail.

$min0 = PHP_INT_MAX; 
$min1 = PHP_INT_MAX; 
foreach ($test as $i) { 
    if($i[1] < $min1) 
    { 
     $min0 = $i[0]; 
     $min1 = $i[1]; 
    } 
} 

Cela se traduira par min0 $ == 1 et min1 $ == 23

0

Vous aurez besoin d'introduire une logique de base:

$result = array(0, PHP_INT_MAX); 
foreach($test as $i) 
    if($i < $result[1]) 
     $result = array($i[0], $i[1]); 
1

Vous pouvez utiliser array_reduce:

$array = array(
    array(1, 23, 20), 
    array(2, 45, 63), 
    array(4, 63, 40), 
); 
$callback = function ($a1, $a2) { 
    if ($a1[1] >= $a2[1]) { 
     return $a2; 
    } else { 
     return $a1; 
    } 
} 
$min = array_reduce($array, $callback, array(0, PHP_INT_MAX, 0)); 
var_dump($min); // array(1, 23, 20); 

maintenant, cela va probablement avoir des problèmes si vous avez plusieurs éléments à l'identique [1] éléments ... Mais il gère de manière transparente le cas où le tableau est vide. Et en général, tout ce que vous devez faire est de faire votre comparaison dans la fonction de rappel pour tous les problèmes de type "filtrage" où vous pouvez résumer le filtrage à une comparaison de 2 éléments. Donc, vous faites la comparaison de chaînes, etc pour déterminer lequel des deux est mieux ...

et il devrait être plus efficace qu'une sorte, car il ne nécessite qu'une seule passe sur le tableau (Il est O(n) alors sorting est O(n log n) et au pire O(n^2)) ...

0

vous pouvez utiliser un simple min (O (n)) boucle comme vous l'avez fait, et array_slice pour affecter les deux premiers indices lorsqu'un est le plus bas:

$min = PHP_INT_MAX; 
$arrMin = array(); 
foreach ($test as $i) { 
    if ($i[1] < $min) { 
     $min = $i[1]; 
     $arrMin = array_slice($i, 0, 2); 
    } 
} 
0

vous devriez simplement saisir la clé de tableau du plus petit nombre:

$min = PHP_INT_MAX; 
$minkey = 0; 
foreach ($test as $key => $i) { 
    if($min > $i[1]) { 
     $min = $i[1]; 
     $minkey = $key; 
    } 
} 

alors, vous pouvez simplement accéder à la chose avec $ test [de Minkey de $]