Page 1 sur 2
recherche de données dans un tableau
Posté : 27 nov. 2006, 17:53
par Invité
Bonjour,
j'ai un petit problème que je n'arrive pas à résoudre, c'est le suivant:
j'ai un tableau que j'ai récupérer d'un fichier xml:
Array ( [0] => Array ( [NOM] => rochefort [PRENOM] => jean [CIVILITE] => M. [DATEDENAISSANCE] => JJ
[1] => Array ( [NOM] => canet [PRENOM] => guillaume [CIVILITE] => M. [DATEDENAISSANCE] => H )
Il s'agit d'un tableau multidimensionnel, et c'est à partir de là que ça se complique, je voudrais récuperer la ligne (plus précisément la clé de cette dernière) qui contient un nom précis, par exemple:
récuperer la clé de la ligne qui contient rochefort.
Mon code est le suivant:
$nomrecherche="rochefort";
foreach($personne as $cle => $nomrecherche){
if($personne[$cle]['NOM']==$nomrecherche){
echo key($personne);}
}
je n'ai pas de message d'erreur, je pense etre pas loin de la solution mais ma condition if ne filtre rien du tout!!!
Si qqun pouvait m'éclairer...
Merci d'avance.
Julie.
Posté : 27 nov. 2006, 17:59
par Cyrano
Modération :
Afin d'obtenir plus de réponses, le sujet est déplacé dans le forum "Débuter en PHP".
Merci de prendre le temps de lire les règlements.
Posté : 27 nov. 2006, 18:04
par jojolapine
salut,
tu est certe pas très loins de la solution, mais tu mélange tout de même quelque petites choses:
voici le code commenté:
// initialisation de la variable de recherche
$nomrecherche="rochefort";
//on parcours le tableau ligne par ligne, en récupérant également la clé (qui correspond à la ligne)
foreach($personne as $cle => $valeur){
if($valeur[NOM]==$nomrecherche){
echo "Le mot ".$nomrecherche." a été trouvé à la ligne (l'entrée): ".$cle;
}
}
est-ce que tu comprends les erreurs que tu à faites ?
Edit le post de Ryle m'a fait voir une erreu qui est corrigée...
Posté : 27 nov. 2006, 18:10
par Ryle
Il y a juste un petit soucis dans ton foreach().
foreach($personne as $cle => $nomrecherche)
signifie
Pour chaque élément du tableau $presonne, j'affecte la clé dans $cle et la valeur dans $nomrecherche (ce qui en l'occurence écrase le nom que tu recherche). Il faudrait donc dans un premier temps changer le nom de cette variable.
Ceci étant fait, tu vas obtenir à chaque itération $cle égal à 0, puis 1, etc. et $valeur (si c'est ainsi que tu as nommé la valeur associée à la clé) qui va correspondre à "Array ( [NOM] => rochefort [PRENOM] => jean [CIVILITE] => M. [DATEDENAISSANCE] => JJ)" puis "Array ( [NOM] => canet [PRENOM] => guillaume [CIVILITE] => M. [DATEDENAISSANCE] => H )", etc.
C'est donc dans ce tableau $valeur qu'il te faut aller chercher ton nom et le comparer au $nomrecherche du début. S'ils correspondent, $cle contient la ligne à laquelle tu as trouvé le résultat. Tu peux l'afficher, la stocker ou bien sortir de la boucle avec un "break" pour qu'elle ne soit plus modifiée

Posté : 27 nov. 2006, 18:35
par Invité
J'ai pigé mes erreurs..... merci bcp
mais il y a tout de même un petit "hic"! c'est que l'affichage ne fonctionne pas...
si j'enlève un égal dans le if, il y a affichage de $nomrecherche et $cle, (affichage répété à chaque clé)
Le mot rochefort a été trouvé à la ligne (l'entrée): 1
Le mot rochefort a été trouvé à la ligne (l'entrée): 2....
il y a donc un petit pb dans le if et je ne vois pas ce qui cloche...
Posté : 27 nov. 2006, 18:40
par jojolapine
Attention, l'opérateur "=" est un opérateur d'assignation,
exemple:
$a=2;
à ce moment là $a prend la valeur
Pour faire des tests, on utilise "==" ou "===" la différence entre les deux est le deuxième test la valeur comme le premier, mais également le type...
Posté : 27 nov. 2006, 18:52
par Invité
même si je rajoute un = en plus ça ne fonctionne le if...
Posté : 27 nov. 2006, 18:53
par Invité
même si je rajoute un = en plus ça ne fonctionne pas le if...
(j'avais oublié le "pas"!)
Posté : 27 nov. 2006, 18:59
par jojolapine
montre donc le code que tu essaye?
Posté : 27 nov. 2006, 19:02
par Invité
<?php
session_start();
//adresse du fichier
$path2 = "./base_de_cv";
$extension= "_.xml";
$file="candidats".$extension;
$filename2=$path2."/".$file;
$handle = fopen ($filename2, "r");
$contenu = fread ($handle, filesize ($filename2));
fclose ($handle);
$p = xml_parser_create();
xml_parse_into_struct($p, $contenu, $vals, $index);
xml_parser_free($p);
$countVals= count($vals);
for ($i = 0; $i < $countVals; $i++){
if ($vals[$i]['tag'] == 'CANDIDAT' && $vals[$i]['type'] == 'open'){
while (!($vals[$i]['tag'] == 'CANDIDAT' && $vals[$i]['type'] == 'close')){
if ($vals[$i]['tag'] != 'CANDIDAT' && $vals[$i]['type'] == 'complete'){
$tmp[$vals[$i]['tag']] = $vals[$i]['value'];
}
$i++;
}
$sortie[] = $tmp;
$jo=sizeof($sortie);
}
}
//print_r($sortie);
//echo $sortie;
//recherche de la ligne ou se trouve $_POST['nom']
$nomrecherche=$_POST['nom'];
foreach($sortie as $cle => $valeur){
if($valeur['NOM']==$nomrecherche){
echo "Le mot ".$nomrecherche." a été trouvé à la ligne (l'entrée): ".$cle;
}
}
?>
Posté : 27 nov. 2006, 19:12
par jojolapine
quand tu dis que ça ne fonctionne pas, quel est le message d'erreur?
Posté : 27 nov. 2006, 19:15
par Invité
le pb est qu'il n'y a pas de message d'erreur!
pour essayer de faire afficher qqch, il faut enlever le if...
j'ai l'imprssion que le if ne fait rien du tout
y aurait il une autre façon "simple" pour retourner ce que je veux?
Posté : 27 nov. 2006, 19:20
par fab
Au passage il y a des balises
pour poster le code ainsi il sera en couleur et la compréhension n'en sera que plus aisée
Posté : 27 nov. 2006, 19:20
par jojolapine
essaye de mettre ceci dans ton code après le traitement du fichier:
print('<pre>');
print_r($sortie);
print('</pre>');
et donne nous le résultat
Posté : 27 nov. 2006, 19:35
par Invité
Code : Tout sélectionner
Array
(
[0] => Array
(
[NOM] =>
rochefort
[PRENOM] =>
jean
...
[1] => Array
(
[NOM] =>
canet
[PRENOM] =>
guillaume
le code que tu viens de me donner s'affiche correctement...