problème avec in_array()

Répondre
Yadutaf
le 19/09/2007 à 10:10
Yadutaf
Bonjour,

je cherche à utiliser la fonction in_array avec un tableau issu d'une base MySql.
J'appelle mon tableau comme ceci :

$sql ='SELECT code FROM matable ORDER BY code';
$resultat = $bdd->query($sql);
$tableau = $resultat->fetchAll(PDO::FETCH_ASSOC);
foreach ($tableau as $ligne) {
echo $ligne['code'].' -- ';
}


Ce code me retourne bien ce que j'attends :
10, 20, 2010, 2020, 30, 3010, 3020, 3030, 40, 50, 60, 6010, 6020, 6030, 70, 80, 90, 9010, 9020, AA, AA10, AA20, AA30

Ensuite, j'écris :

if (in_array('AA10', $tableau, false)) {
echo 'oui';
} else
echo 'non';


et j'obtiens systématiquement le même 'non' alors que, en l'occurence, j'attens un 'oui'.

C'est le même problème avec un tableau indexé (PDO::FETCH_BOTH) ou un objet (PDO::FETCH_OBJ).

Je vous remercie pour votre aide.
moogli
le 19/09/2007 à 10:54
moogli
salut,

simplement parce que $tableau est un tableau :) il contient des tableau qui vont contenir ce que tu cherche. cette fonction ne "fonctionne" qu'avec des tableau 1D un exemple dans la doc de php.net est donné pour les tableaux 2D

personellement je pense que cette recherche devrait être faite par le sgbd !

@+
Il en faut peu pour être heureux !!!!!
Yadutaf
le 19/09/2007 à 19:58
Yadutaf
Merci de m'avoir mis sur la voix. Donc je fais :
<?php
for ($i=0; $i<count($tableau); $i++ ) {
if (in_array('AA30', $tableau[$i], false))
echo 'trouvé, ';
}
?>

... et ça marche

Offline a écrit :
personellement je pense que cette recherche devrait être faite par le sgbd !


Sans doute as-tu raison, et c'est ce que fait mon script actuel. Cependant j'appelle une fois cette liste en début de script pour affichage. Ensuite je crée un certain nombre de valeurs à l'aide d'une boucle et je veux comparer chacune de ces valeurs avec celles de la liste.

Script actuel :
<?php
$sql = 'SELECT code FROM ma table ORDER BY code';
...
$resultat = $bdd->query($sql);
$tableau = $resultat->fetchAll(PDO::FETCH_ASSOC);

foreach ($tb as $ligne) {
$mavaleur = fonctionquicréelavaleur();
$sql = 'SELECT code FROM matable WHERE code LIKE '.$mavaleur;
...
$resultat = $bdd->query($sql);
$tableau = $resultat->fetch(PDO::FETCH_BOTH);
if (isset($tableau['code'])) {
$string = 'mavaleur a été trouvé';
}
else $string = '';
}
?>


Il faut quand même avouer que c'est assez lourdingue et que ça ne doit pas être très optimisé !

Je préfèrerais écrire quelque chose comme ceci :
<?php
$sql = 'SELECT code FROM ma table ORDER BY code';
//...
$resultat = $bdd->query($sql);
$tableau = $resultat->fetchAll(PDO::FETCH_ASSOC);
foreach ($tb as $ligne) {
$mavaleur = fonctionquicréelavaleur();
$string = '';
for ($i=0; $i<count($tableau); $i++ ) {
if (in_array($mavaleur, $tableau[$i], false))
$string = 'mavaleur a été trouvé';
}
}
?>

Je trouve cela plus ... élégant et surtout plus économe. Peut-être que je me trompe !
LupusMic
le 19/09/2007 à 21:51
LupusMic
Si tu travaille avec des petites listes, c'est certainement judicieux. Mais si la liste deviens trop grande attention aux dégâts !
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Yadutaf
le 19/09/2007 à 22:48
Yadutaf
Effectivement, il s'agit de petites listes ne regroupant pas plus de quelques dizaines de lignes.

Mais pourquoi cela serait dangereux avec de grandes listes ?
LupusMic
le 20/09/2007 à 16:25
LupusMic
Je te répondrais avec quelques autres questions : Quelle est la limite d'exécution en terme de temps et de mémoire d'un script PHP ?

C'est bien sûr paramétrable, mais le serveur risque de devenir fortement ralenti. Tu imagines si à chaque requête HTTP tu dois charger 1 Go de données et les parcourir pour savoir si une valeur est présente ?
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Yadutaf
le 20/09/2007 à 19:42
Yadutaf
En l'occurrence je ne suis même pas sûr d'avoir un kilo de données dans le tableau à tester. Il y en a plus dans le tableau parcouru pour créer la valeur.

Ceci dit, à partir de quand doit-on privilégier le travail du sgbd par rapport à celui du serveur PHP ? Des accès récurants et en grand nombre au sgbd ne risquent ils pas de pénaliser fortement l'exécution globale, surtout si celui-ci est distant ?
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours