2010-09-24 10 views
0

Je tableau et contient 50 valeurs,php tri du tableau avec une préférence

exemple

londres, bluehit, vert, lonpark, abc, AAB, Lonsee

je veux trier selon ma préférence , je donne un argument,

exemple, si je donne arugment comme mon tableau alors lon doit former comme

Londres, lonpark, Lonsee, AAB, abc, blurhit, vert, Lonsee,

donc au-dessus de ma sortie de tableau est i donné paramètre comme lon, donc commencé avec mon caractère de préférence des valeurs de tableau et l'ordre alphabétique,

Advise,

Pour moi, la question ci-dessus est trop complexe, bcoz je sais asort, ksort, asc seulement, c'est

première fois que je rencontre ce genre d'exigence.

+0

Est-il un tableau associatif? ou multidimensionnel? –

+2

Pourquoi lonsee est-il à la fin de la liste triée, ainsi qu'au début? –

Répondre

2
  1. remplacer la chaîne en question avec un caractère avec le code 1
  2. trier normalement
  3. remplacer le caractère retour

ce qu'il est;)

$str = "lon"; 
$a = array('london', 'bluehit', 'green', 'lonpark', 'abc', 'aab', 'lonsee'); 
$b = preg_replace("~^$str~", "\x01", $a); 
sort($b); 
$b = preg_replace('~\x01~', "lon", $b); 
print_r($b); 

màj: encore plus simple est de précédez la chaîne avec "\ x01" plutôt que de le remplacer. Cela permet également de correspondance insensible à la casse ou pour correspondre à un ensemble de chaînes:

$str = "lon"; 
$a = array('london', 'bluehit', 'green', 'Lonpark', 'abc', 'aab', 'lonsee'); 
$b = preg_replace("~^$str~i", "\x01$0", $a); 
sort($b); 
$b = str_replace('~\x01~', "", $b); 
print_r($b); 
+0

est-ce sensible à la casse – Bharanikumar

+0

@Bharanikumar: voir la mise à jour – user187291

2

Cela est demandé beaucoup. Jetez un oeil à l'aide d'une fonction de tri personnalisée. De php.net: uksort et .

+5

Hehe. Amusant de penser à utiliser une fonction nommée uksort() pour placer Londres en haut de la liste. ;-) – Spudley

+0

Haha haha ​​haha ​​ha! (Je l'aurais juste tapé 'lol' mais j'ai été déjoué par la limite de caractères.) – Stephen

1

Vous pouvez utiliser usort, vous pouvez définir votre propre fonction de tri des données.

2

Comme les autres l'ont dit, usort et un comparateur sur mesure s'adapterait bien. Voici un exemple qui a une fonction usine (dans ce cas, une fonction qui renvoie une fonction) qui génère des comparateurs (en utilisant closures) en fonction du préfixe requis.

$subject = explode(',', 'london,bluehit,green,lonpark,abc,aab,lonsee'); 

function make_comparator($prefix) 
{ 
    return function ($a, $b) use ($prefix) { 
     if (strpos($a, $prefix) === 0 && strpos($b, $prefix) !== 0) { 
      // $a starts with $prefix (and $b does not), sift up 
      return -1; 
     } elseif (strpos($a, $prefix) !== 0 && strpos($b, $prefix) === 0) { 
      // $b starts with $prefix (and $a does not), sift down 
      return 1; 
     } else { 
      // Otherwise, do a normal string comparison 
      return strcmp($a, $b); 
     } 
    }; 
} 

$sorted = $subject; 
usort($sorted, make_comparator('lon')); 
var_dump($sorted); 

Pour les versions PHP inférieure à 5.3.0 (requis pour ci-dessus), vous pouvez faire quelque chose de similaire:

function prefix_comparator($a, $b, $prefix) { 
    if (strpos($a, $prefix) === 0 && strpos($b, $prefix) !== 0) { 
     // $a starts with $prefix (and $b does not), sift up 
     return -1; 
    } elseif (strpos($a, $prefix) !== 0 && strpos($b, $prefix) === 0) { 
     // $b starts with $prefix (and $a does not), sift down 
     return 1; 
    } else { 
     // Otherwise, do a normal string comparison 
     return strcmp($a, $b); 
    } 
} 

$sort_by_lon = create_function('$a, $b', 'return prefix_comparator($a, $b, "lon");'); 
$sorted = $subject; 
usort($sorted, $sort_by_lon); 
var_dump($sorted); 

(Toutes mes excuses pour le jargon)

+0

Salut, salathe, merci, y at-il une fonction appelez l'utilisation, bcoz dans la fonction ci-dessus u utilisé le mot clé use, – Bharanikumar

+0

Bharanikumar, the' use 'keyword est utilisé pour permettre à une fonction anonyme d'accéder à des variables en dehors de sa portée normale (c'est-à-dire la fermeture). – salathe

+0

j'ai exécuté le code ci-dessus, j'ai obtenu une erreur d'analyse sur cette ligne return function ($ a, $ b) use ($ prefix), programme ne me permettant pas d'exécuter .. erreur – Bharanikumar

0

est ici une autre possibilité pour ver. 53+:

function pref_sort($arr, $pref, $case_insensitive = true) 
{ 
    $case_insensitive ? natcasesort($arr) : sort($arr);   
    $pref_arr = array_filter($arr, 
     function($val) use ($pref){ 
      return (strpos(strtolower($val), strtolower($pref)) === 0); 
     }); 
    return array_values($pref_arr + array_diff($arr, $pref_arr)); 
} 

Utilisation:

$pref_str = 'lon'; 
$array = array('green', 'Lonpark', 'london', 'bluehit', 'abc', 
       'aab', 'lonsee', 'lon', 'Lon', 'Aab'); 

// Case-insensitive: 
$sorted_array = pref_sort($array, $pref_str); 
print_r($sorted_array); 
/** 
Array 
(
    [0] => lon 
    [1] => Lon 
    [2] => london 
    [3] => Lonpark 
    [4] => lonsee 
    [5] => Aab 
    [6] => aab 
    [7] => abc 
    [8] => bluehit 
    [9] => green 
) 
**/ 

// Case-sensitive: 
$sorted_array = pref_sort($array, $pref_str, false); 
print_r($sorted_array); 
/** 
Array 
(
    [0] => Lon 
    [1] => Lonpark 
    [2] => lon 
    [3] => london 
    [4] => lonsee 
    [5] => Aab 
    [6] => aab 
    [7] => abc 
    [8] => bluehit 
    [9] => green 
) 
**/