in_array() mal appliqué ?

VaN
Mammouth du PHP | 1107 Messages

17 déc. 2008, 19:14

Bonsoir,

J'ai 2 tableaux PHP, que voici :
$adAreas :
Array
(
[0] => Array
(
[adArea_area_id] => 1
)

[1] => Array
(
[adArea_area_id] => 2
)

)
$areas :
Array
(
[0] => Array
(
[area_id] => 1
[area_name] => Home
)

[1] => Array
(
[area_id] => 2
[area_name] => Espace Perso
)

[2] => Array
(
[area_id] => 3
[area_name] => Création de compte
)

[3] => Array
(
[area_id] => 4
[area_name] => Achats
)

[4] => Array
(
[area_id] => 5
[area_name] => Création d'annonce
)

[5] => Array
(
[area_id] => 6
[area_name] => Affichage d'annonce
)

[6] => Array
(
[area_id] => 7
[area_name] => Recherche
)

[7] => Array
(
[area_id] => 8
[area_name] => Pages classiques
)

)
Dans une boucle sur le tableau $areas, je cherche à savoir si la valeur de la cellule [area_id] est présente dans la colonne [adArea_area_id] du tableau $adAreas (dans n'importe quelle ligne, peut importe).

J'ai donc fouiller la doc, et je suis tombé sur in_array(), qui semble bien convenir. Je teste donc un
foreach($areas as $key => $area) {
					if(in_array($area['area_id'], $adAreas)) {
						$checked = 'checked="checked"';
					}
					else
						$checked = '';
					echo '<td width="20%"><input type="checkbox" name="ad_areas[]" value="'.$area['area_id'].'" style="vertical-align:middle;" '.$checked.' /> '.$area['area_name'].'</td>';
					if($count % 4 == 0)
						echo "</tr>\n</tr>";
					$count++;
				}
Hélas, je remarque que le if() n'est jamais vrai, car aucune de mes checkbox n'est cochée, alors que la 1ère et la 2eme devrait l'être.

Une erreur dans mon code ? Ou alors ai-je mal compris in_array() ?

Eléphanteau du PHP | 20 Messages

17 déc. 2008, 20:37

A priori il faut que ta fonction in_array soit récursive. Il y a çà dans les commentaires de la doc
<?php
function recursive_in_array($needle, $haystack) {
    foreach ($haystack as $stalk) {
        if ($needle === $stalk || (is_array($stalk) && recursive_in_array($needle, $stalk))) {
            return true;
        }
    }
    return false;
}
?>
http://fr.php.net/in_array

VaN
Mammouth du PHP | 1107 Messages

17 déc. 2008, 23:48

effectivement, ça marche. Pas bien compris pourquoi par contre.

Merci.

Eléphanteau du PHP | 20 Messages

19 déc. 2008, 20:29

En fait, PHP vérifie uniquement la variable passée en paramètre, c'est plutôt logique. A la base, ce n'est pas le but recherché.
;)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

20 déc. 2008, 11:03

in_array() va en fait te permettre de tester si une valeur est contenue dans un tableau à une dimension (voire plusieurs, mais il ne testera de toute façon que la première).

Comme ton tableau $adAreas est en réalité un tableau de tableaux, lorsque tu lui demandes de tester si ton id est contenu dant $adAreas, il va parcourir le tableau, constater qu'il ne contient que des Array et qu'aucun ne correspond à l'id que tu lui demandes de tester :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

VaN
Mammouth du PHP | 1107 Messages

20 déc. 2008, 12:44

Et donc il n'existe pas de fonctions natives permettant de trouver une valeur dans un tableau multi-dimensionnels (et accessoirement de retourner la key associée) ? Il faut forcement passer par une fonction faite maison ?