2012-11-13 2 views
0

Disons que j'ai un petit tableau():Comprendre le décalage de bande?

$array = array(
     'Pantin', 
     'Paris', 
     'Paris', 
     'Puhahaa', 
     'Ptdr', 
     'Roumanie', 
     'Rlolo' 
    ); 

Ce que je veux faire? simplement obtenir tous les mots qui commencent par la « r » lettre

$dataLen = sizeof($array); 
$results = array(); 

for ($i = 0; $i < $dataLen && count($array) < 10; $i++) { 
    if (stripos($array[$i], 'r', 0)) { // 

     array_push($results, $array[$i]); 
    } 
} 

print_r($results); // Output : Array ([0] => Paris [1] => Paris [2] => Ptdr) 

Je ne peux pas comprendre .. Je mets 0 comme le décalage, mais il me donne des mots qui commencent par la lettre P et que « contiennent » la lettre R.

+1

Vous vous demandez à "lancer la recherche à l'offset 0", pas "arrêter la recherche après offset 0". Essayez 'in_array ($ array [$ i] [0], array ('R', 'r'))' à la place. – DCoder

+0

@DCoder Oui merci, j'ai vu ça sur internet! Mais pourquoi === 0 n'est-il pas censé être FAUX? Pourquoi devrais-je le mettre en dehors de la fonction? Pouvez-vous m'expliquer cela, je vais accepter votre réponse. – Ydhem

Répondre

3

Zéro est la valeur par défaut, donc ces choses sont équivalentes;

stripos($array[$i], 'r', 0) 
stripos($array[$i], 'r') // Same 

C'est, ils commencent à la position 0 et essayer de trouver la lettre r ou R. Si ce n'est pas sur la position 0, ils vérifient la deuxième lettre, puis la troisième lettre, etc.

Stripos renvoie la position de la lettre trouvée. Pour Paris est renvoie 2, pour Rlolo il renvoie 0. S'il est introuvable, il renvoie la valeur false.

Par défaut, 0 et false sont tous deux interprétés comme faux. Donc, si la première lettre est R, stripos renvoie 0 et l'instruction if n'est pas exécutée. Pour résoudre ce problème, utilisez ce code:

if (stripos($array[$i], 'r') !== false) { ... } 

Si vous voulez vérifier que la première lettre et non les lettres suivantes, vous pouvez faire quelque chose comme ceci:

$word = $array[$i]; 
$firstLetter = $word[0]; 
if ($firstLetter == 'r' || $firstLetter == 'R') { ... } 
+2

ou simplement 'stripos ($ array [$ i], 'r') === 0' – Yoshi

+0

Clair et simple! Merci beaucoup! – Ydhem

+0

@Yoshi: c'est probablement plus lent que de simplement vérifier le premier symbole directement. Pas de manière significative, mais quand même. – DCoder

1

Une autre méthode serait d'utiliser array_filter avec un rappel.

$results = array_filter($array, function($var) { 
    return strtolower($var[0]) == 'r'; 
}); 

(Bien sûr, vous pouvez également utiliser return stripos($var, 'r') === 0;)

+0

Merci pour cette alternative. – Ydhem