2011-03-18 5 views
7

Je suis en train de créer un autoloader qui étend le include_path. Il prend un tableau, ajoute le chemin explode() d include, supprime toutes les références au répertoire courant, ajoute un seul répertoire courant au début du tableau, et enfin rejoue() le tout pour former un nouveau chemin d'inclusion . Le code est ci-dessousarray_unique() sans tri

<?php 
static public function extendIncludePath (array $paths) 
{ 
    // Build a list of the current and new paths 
    $pathList = array_merge (explode (PATH_SEPARATOR, $paths), explode (PATH_SEPARATOR, get_include_path())); 
    // Remove any references to the current directory from the path list 
    while ($key = array_search ('.', $pathList)) 
    { 
     unset ($pathList [$key]); 
    } 
    // Put a current directory reference to the front of the path 
    array_unshift ($pathList, '.'); 
    // Generate the new path list 
    $newPath = implode (PATH_SEPARATOR, $pathList); 
    if ($oldPath = set_include_path ($newPath)) 
    { 
     self::$oldPaths [] = $oldPath; 
    } 
    return ($oldPath); 
} 
?> 

Je voulais aussi utiliser array_unique() sur le tableau avant d'imploser pour que PHP ne tient pas à la recherche au même endroit plusieurs fois si quelqu'un est négligent et précise le même chemin plus qu'une seule fois. Cependant, j'ai également besoin de maintenir l'ordre de tri du tableau car include regarde dans les répertoires dans l'ordre où ils sont définis dans le chemin include. Je veux d'abord regarder dans le répertoire courant, puis ma liste de répertoires de recherche et enfin le chemin d'inclusion original afin que, par exemple, une ancienne version d'une bibliothèque commune dans include_path par défaut ne soit pas incluse en faveur d'une version plus récente dans ma liste de recherche.

Pour ces raisons, je ne peux pas utiliser array_unique() car il trie le contenu du tableau.

Existe-t-il un moyen d'obtenir array_unique pour préserver l'ordre des éléments dans mon tableau?

+0

Trier de passer par votre demande: Est-ce '$ array = array_flip (array_flip ($ array))' une option pour vous? ('array_flip' échange les valeurs avec les clés, et puisque les clés sont toujours uniques, un double' array_flip' rend les valeurs de votre tableau uniques.) – pinkgothic

Répondre

7

Ne pas utiliser array_unique() directement; mais array_unique ne conserve les clés, de sorte que vous pouvez faire un ksort() après pour recréer l'ordre initial des entrées

1

Quelque chose comme:

$temp = array(); 

foreach ($original_array as $value) { 
    $temp[$value] = 1; 
} 

$original_array = array_keys($temp); 
+0

Heads-up: Il y a une fonction pour cette boucle [effectivement; si vous ne vous souciez pas de la valeur étant '1']. 'array_flip()'. :) – pinkgothic

+1

Oh putain je suis tombé à la règle PHP # 0: il y a toujours une fonction PHP dont vous n'avez jamais entendu parler :) –

+0

Bahaha. : D * chante une chanson aux fonctions de PHP qui guettent dans l'embuscade le peu méfiant, priant pour le passage sûr! * – pinkgothic

2

vous pouvez également utiliser array_count_value. vous obtiendrez votre résultat de tableau unique à la clé de votre résultat de fonction

son ne pas casser votre contenu de tri de la matrice.

Référence: http://php.net/manual/en/function.array-count-values.php

+0

Ooh, approche créative! Quickref pour les curieux: '$ unique = array_keys (array_count_values ​​($ source))' – pinkgothic