J'ai un tableau de 15000 éléments dont chacun est un tableau de 4 éléments. Je veux trier par le second élément du 4. Initialement, j'ai fait les clés du tableau original le deuxième élément, puis k-tri mais malheureusement, certains des seconds éléments sont des doublons et comme une clé ne peut pas se référer à plusieurs éléments perdus certains éléments en transition. Je pourrais trier les bulles par le second élément mais je cherche quelque chose qui fonctionne au moins de l'ordre de nlog (n). Quelqu'un peut-il penser à un bon algorithme (ou peut-être une fonction en php que je ne connais pas) qui peut trier par le second élément? Je vous remercie!Tri d'un tableau de tableaux en PHP -> Besoin d'un bon algorithme
1
A
Répondre
3
Je pense que vous pouvez utiliser usort
et définir la fonction cmp_function pour utiliser le second élément.
0
Je ne sais pas ce que l'implémentation interne de usort est, mais je parie que c'est mieux que bubbleort (c'est probablement quicksort).
1
Comme d'autres l'ont dit, usort ou uasort pour maintenir les clés du tableau est ce que vous voulez:
<?php
$myArray = array(
'fruits' => array(
array('apples', 'oranges', 'bananas')
),
'vegetables' => array(
array('lettuce', 'carrots', 'peas')
),
'monkeys' => array(
array('Curious George', 'Amy', 'Marcel')
)
);
// PHP 5.3+ example using a closure
uasort($myArray, function(array $a, array $b) {
// Use whatever sorting algorithm you like
return strnatcasecmp($a[1], $b[1]);
});
var_export($myArray);
Exécution de la sortie de volonté ci-dessus:
array (
'monkeys' =>
array (
0 =>
array (
0 => 'Curious George',
1 => 'Amy',
2 => 'Marcel',
),
),
'vegetables' =>
array (
0 =>
array (
0 => 'lettuce',
1 => 'carrots',
2 => 'peas',
),
),
'fruits' =>
array (
0 =>
array (
0 => 'apples',
1 => 'oranges',
2 => 'bananas',
),
),
)
Voici un exemple qui n'utilise pas une fermeture pour pré PHP 5.3:
sortFunc(array $a, array $b)
{
return strnatcasecmp($a[1], $b[1]);
}
uasort($myArray, 'sortFunc');
Je pense que vous devriez souligner que closu res et donc votre solution sont pris en charge uniquement dans php 5.3.0 et plus –
Cet exemple utilise une fermeture et ne fonctionne qu'avec PHP 5.3+ :) –