2010-07-21 3 views
0

J'ai un tableau multi dimensions:partie de tri d'un tableau multidimensionnel

$array[0] = array (name => "Bob", 
    position => "Chair", 
    email => "[email protected]" 
); 
$array[1] = array (name => "Al", 
    position => "", 
    email => "[email protected]" 
); 
//etc.. 

Je veux les trier afin que ceux dont la position = « » sont d'abord, puis le reste par ordre alphabétique par nom ... I ne suis pas très familier w/tri des tableaux multidimensionnels, quelqu'un pourrait-il m'aider? Merci!

+0

Et dans quel ordre voulez-vous que ceux sans mesure d'être? Par exemple, alphabétique par email/nom ou dans leur ordre d'origine? – salathe

+0

duplication possible de [Comment trier un tableau multidimensionnel par valeur?] (Http://stackoverflow.com/questions/3281841/how-do-i-sort-a-multi-dimensional-array-by-value) – Wrikken

Répondre

3
<?php 
$array[0] = array (name => "Bob", position => "Chair", email => "[email protected]"); 
$array[1] = array (name => "Al", position => "",email => "[email protected]"); 
print_r($array); 

$idxPos = array(); 
for ($i=0;$i<count($array);$i++) 
{ 
    $idxPos[$i] = $array[$i]["position"]; 
} 
arsort($idxPos); 

$arrayNew = array(); 
$sortedKeys = array_keys($idxPos); 
for($p=0;$p<count($idxPos);$p++) 
{ 
$arrayNew[] = $array[$sortedKeys[$p]]; 
} 
$array = $arrayNew; 

print_r("<br />"); 
print_r($array); 
?> 
+0

gosh, son formatage mon php. Les backticks – Irwin

+0

sont généralement meilleurs pour '$ small_bits', alors que indenter avec 4 espaces est meilleur pour les blocs de code. Edité pour rendre les choses plus jolies :) – Matchu

+0

merci @Matchu! – Irwin

0

Vous voudrez probablement essayer usort pour pouvoir utiliser une fonction de tri personnalisée. Dans la fonction de tri, vous pouvez vérifier une ["position"] vs b ["position"] de la manière que vous décrivez.

1

La fonction usort est probablement votre meilleur pari pour cela:

usort($array, function($a, $b) { 
    if (empty($a['position']) && !empty($b['position'])) { 
     return 1; 
    } 
    else if (!empty($a['position']) && empty($b['position'])) { 
     return -1; 
    } 
    else { 
     return strcmp($a['name'], $b['name']); 
    } 
}); 

fonctions anonymes ont été introduites en PHP 5.3.0. Si vous utilisez une version antérieure, vous pouvez simplement définir une fonction régulière à la place:

function cmp($a, $b) { 
    if (empty($a['position']) && !empty($b['position'])) { 
     return 1; 
    } 
    else if (!empty($a['position']) && empty($b['position'])) { 
     return -1; 
    } 
    else { 
     return strcmp($a['name'], $b['name']); 
    } 
} 

usort($array, 'cmp');