189 votes

Trier un tableau en fonction d'un autre tableau?

Est-il possible en PHP de faire quelque chose comme cela? Comment vous y prendriez-vous sur l'écriture d'une fonction? Ici est un exemple. L'ordre est la chose la plus importante.

$customer['address'] = '123 fake st';
$customer['name'] = 'Tim';
$customer['dob'] = '12/08/1986';
$customer['dontSortMe'] = 'this value doesnt need to be sorted';

Et j'aimerais faire quelque chose comme

$properOrderedArray = sortArrayByArray($customer, array('name', 'dob', 'address'));

Parce qu'à la fin, j'utilise un foreach() et ils ne sont pas dans le bon ordre (parce que j'ai ajouter les valeurs d'une chaîne de caractères qui doit être dans l'ordre correct et je ne sais pas à l'avance l'ensemble de la gamme de clés/valeurs).

J'ai regardé à travers PHP interne de la matrice de fonctions, mais il semble que vous ne pouvez trier par ordre alphabétique ou numérique.

428voto

Darkwaltz4 Points 761

Utilisez simplement array_merge. Cela fonctionne en commençant par le tableau que vous donnez (dans le bon ordre) et en écrasant / ajoutant les clés avec les données de votre tableau actuel:

 $customer['address'] = '123 fake st';
$customer['name'] = 'Tim';
$customer['dob'] = '12/08/1986';
$customer['dontSortMe'] = 'this value doesnt need to be sorted';

$properOrderedArray = array_merge(array_flip(array('name', 'dob', 'address')), $customer);

//$properOrderedArray -> array('name' => 'Tim', 'address' => '123 fake st', 'dob' => '12/08/1986', 'dontSortMe' => 'this value doesnt need to be sorted')
 

ps - Je réponds à cette question "obsolète", parce que je pense que toutes les boucles données dans les réponses précédentes sont excessives.

122voto

Eran Galperin Points 49594
Là vous allez

45voto

ekbUser Points 61

Une autre façon pour PHP> = 5.3.0:

 $customer['address'] = '123 fake st';
$customer['name'] = 'Tim';
$customer['dob'] = '12/08/1986';
$customer['dontSortMe'] = 'this value doesnt need to be sorted';

$customerSorted = array_replace(array_flip(array('name', 'dob', 'address')), $customer);
 

Résultat:

 Array (
  [name] => Tim
  [dob] => 12/08/1986
  [address] => 123 fake st
  [dontSortMe] => this value doesnt need to be sorted
)
 

Fonctionne bien avec une chaîne et des touches numériques.

28voto

OIS Points 5566
function sortArrayByArray(array $toSort, array $sortByValuesAsKeys)
{
    $commonKeysInOrder = array_intersect_key(array_flip($sortByValuesAsKeys), $toSort);
    $commonKeysWithValue = array_intersect_key($toSort, $commonKeysInOrder);
    $sorted = array_merge($commonKeysInOrder, $commonKeysWithValue);
    return $sorted;
}

16voto

hakre Points 102271

Prenez un tableau en tant que votre commande:

$order = array('north', 'east', 'south', 'west');

Vous pouvez trier un tableau avec un autre fondé sur les valeurs à l'aide d' array_intersectDocs:

/* sort by value: */
$array = array('south', 'west', 'north');
$sorted = array_intersect($order, $array);
print_r($sorted);

Ou dans votre cas, afin de les trier par touches, utilisez array_intersect_keyDocs:

/* sort by key: */
$array = array_flip($array);
$sorted = array_intersect_key(array_flip($order), $array);
print_r($sorted);

Les deux fonctions conserver l'ordre de la premier paramètre et ne retourne que les valeurs (ou clés) à partir de la deuxième matrice.

Donc, pour ces deux cas, vous n'avez pas besoin d'écrire une fonction sur votre propre pour effectuer le tri/ré-organiser.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X