JeuWeb - Crée ton jeu par navigateur
Recuperer la liste des positions de toutes les occurences d'une sous chaine? - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Recuperer la liste des positions de toutes les occurences d'une sous chaine? (/showthread.php?tid=4052)

Pages : 1 2 3


RE: Recuperer la liste des positions de toutes les occurences d'une sous chaine? - Shao - 16-10-2010

Je vais répondre par une autre question :
Qu'est-ce que tu veux faire ensuite de ces positions ? (si c'est pas indiscret)

Selon ta réponse, on trouvera peut-être d'autres solutions. :p

Pour l'instant, à part préfixer, suffixer ou remplacer un mot, je ne vois d'application directe suite à cette recherche (sauf si tu veux vraiment écrire sur ta page "Le nom Argorate se trouve en position 0 et 33"). :/


RE: Recuperer la liste des positions de toutes les occurences d'une sous chaine? - Sephi-Chan - 16-10-2010

Le cas d'utilisation ne serait pas du luxe effectivement. Wink


Sephi-Chan


RE: Recuperer la liste des positions de toutes les occurences d'une sous chaine? - php_addict - 16-10-2010

Shao a écrit :Selon ta réponse, on trouvera peut-être d'autres solutions.

relisez le "user comments". la solution y est....ho la la la

(16-10-2010, 09:27 AM)Sephi-Chan a écrit : Il veut les index de toutes ces occurrences, pas leur nombre.

hou-la-la-la-la vous être tous très fatigués dites-moi Wink vivement les vacances !

(16-10-2010, 10:54 AM)Anthor a écrit : Il suffit de récupérer les offset plutôt que les found.

ouf merci Anthor !! c'est galère pour pas grand chose ce topic dites moi Wink

:cogne:j'insiste: le lien que j'ai donné est la réponse...peut pas faire mieux Wink

bon week-end !


RE: Recuperer la liste des positions de toutes les occurences d'une sous chaine? - Sephi-Chan - 16-10-2010

(16-10-2010, 02:44 PM)php_addict a écrit :
Shao a écrit :Selon ta réponse, on trouvera peut-être d'autres solutions.

relisez le "user comments". la solution y est....ho la la la

(16-10-2010, 09:27 AM)Sephi-Chan a écrit : Il veut les index de toutes ces occurrences, pas leur nombre.

hou-la-la-la-la vous être tous très fatigués dites-moi Wink vivement les vacances !

(16-10-2010, 10:54 AM)Anthor a écrit : Il suffit de récupérer les offset plutôt que les found.

ouf merci Anthor !! c'est galère pour pas grand chose ce topic dites moi Wink

:cogne:j'insiste: le lien que j'ai donné est la réponse...peut pas faire mieux Wink

bon week-end !


Il n'est jamais inutile de connaître le contexte de la demande d'aide (et si ça devenait obligatoire dans une demande d'aide ?).

Tu l'as testé cette fonction avant de la présenter comme solution ?
Certe, elle apporte de gros éléments , mais elle n'est pas la solution.

D'autant qu'elle ne fonctionne pas.


<?php
function searchOccNum($needle, $stack){
$offset = 0;
$found = 0;

if(strpos($pm, $open_link) === false)
return 0;
else{
while(!(strpos($stack, $needle, $offset) === false)){
$found++;
$offset = strpos($pm, $open_link, $offset)+1;
}

return "found: ".$found." times";
}

}

C'est quoi $pm ? C'est quoi $open_link ? Ils sortent d'où ?


$needle = "Argorate";
$stack = "Argorate cherche une fonction qu'Argorate n'aurait pas a faire lui meme.";
$result = searchOccNum($needle, $stack);
var_dump($result); // int(0)

Merci donc d'être un peu plus respectueux et ne pas chercher à fermer la discussion comme tu le fais.


Sephi-Chan


RE: Recuperer la liste des positions de toutes les occurences d'une sous chaine? - Argorate - 16-10-2010

Bon effectivement, votre fonction me donne (indirectement) la solution:


function find_str($str, $string)
{
$position = 0;
$result = array();

while(!(strpos($string, $str, $position) === false))
{
$position = strpos($string, $str, $position);
$result[] = $position;
$position++;
}

return $result;
}


$str = "Argorate";
$string = "Argorate cherche une fonction qu'Argorate n'aurait pas a faire lui meme.";
$result = find_str($str, $string);
var_dump($result); // => array(2) { [0]=> int(0) [1]=> int(33) }

Merci Wink


RE: Recuperer la liste des positions de toutes les occurences d'une sous chaine? - Sephi-Chan - 16-10-2010

Le nom find_str est très mal choisi pour cette fonction. Un nom plus adapté serait find_substring_indexes puisque la fonction trouve les index d'une sous-chaîne.

Et voici une implémentation alternative, puisque la condition de la boucle est vraiment alambiquée à cause de l'idiotie de PHP qui considére 0 comme false.


function find_substring_indexes($needle, $haystack){
$indexes = array();
$index = 0;

while(is_numeric(strpos($haystack, $needle, $index))){
$index = strpos($haystack, $needle, $index);
$indexes[] = $index;
$index++;
}

return $indexes;
}

J'utilise la convention de PHP (ça doit bien être la seule de ce langage xD) au niveau du nommage des arguments, à savoir $needle (aiguille) et $haystack (botte de foin).

Par contre Argorate, peux-tu nous expliquer l'usage que tu fais de cette fonction ? Smile


Sephi-Chan


RE: Recuperer la liste des positions de toutes les occurences d'une sous chaine? - Argorate - 16-10-2010

Ca t'avencera pas a grand chose, mais c'est pour calculer l'ecart type des positions de certaines chaines pour mes stats Wink

PS: m'en veux pas si je garde mes nom de variable bcp plus clair (pour moi) :p


RE: Recuperer la liste des positions de toutes les occurences d'une sous chaine? - Anthor - 16-10-2010

(16-10-2010, 04:48 PM)Sephi-Chan a écrit : [...] puisque la condition de la boucle est vraiment alambiquée à cause de l'idiotie de PHP qui considére 0 comme false.

Pas dans l'exemple d'argorate puisqu'il utilises ===
C'est vraiment histoire de casser du sucre sur PHP...


RE: Recuperer la liste des positions de toutes les occurences d'une sous chaine? - srm - 16-10-2010

Et puis on peut faire mieux quand même :

function findIndexes($sentence, $search) {
preg_match_all("/" . $search . "/", $sentence, $found, PREG_OFFSET_CAPTURE);
array_walk($found[0], create_function('&$v', '$v = $v[1];'));

return $found[0];
}

Et un peu plus joli en PHP 5.3 :


function findIndexes($sentence, $search) {
preg_match_all("/" . $search . "/", $sentence, $found, PREG_OFFSET_CAPTURE);
array_walk($found[0], function(&$v) { $v = $v[1]; });

return $found[0];
}



RE: Recuperer la liste des positions de toutes les occurences d'une sous chaine? - Sephi-Chan - 16-10-2010

(16-10-2010, 05:59 PM)Argorate a écrit : Ca t'avencera pas a grand chose, mais c'est pour calculer l'ecart type des positions de certaines chaines pour mes stats Wink

PS: m'en veux pas si je garde mes nom de variable bcp plus clair (pour moi) :p

Ton nommage est incohérent (l'un des mot est normal ($string), l'autre est le même mot mais abrégé ($str) et n'indique absolument pas le rôle de l'argument.
Tu devrais t'inquiéter d'avoir l'habitude de lire du code cochon…



(16-10-2010, 06:34 PM)Anthor a écrit :
(16-10-2010, 04:48 PM)Sephi-Chan a écrit : [...] puisque la condition de la boucle est vraiment alambiquée à cause de l'idiotie de PHP qui considére 0 comme false.

Pas dans l'exemple d'argorate puisqu'il utilises ===
C'est vraiment histoire de casser du sucre sur PHP...

Non, j'ai cassé du sucre sur le dos de PHP en me moquant des conventions ! J'fais pas que ça non plus !! Smile

L'autre critique concerne tous les langages dynamiquement typés et qui disposent des booléens. Je trouve idiot d'évaluer 0 (ou une chaîne vide) comme le booléen false. Ça inclut aussi Javascript (que j'aime bien), Python et d'autres.

Dans notre cas, c'est cette seule caractristique du langage qui empêche de simplement écrire while(strpos(…)) Et à ce compte, je trouve plus élégant de tester si strpos retourne un entier (is_int ne me venait pas à l'esprit sur le moment).


Sephi-Chan