2011-06-25 5 views
0

J'essaie de créer un script universel qui ajoute des mots-clés à mes pages individuelles (puisque l'en-tête est dans un fichier include) donc je reçois la fin de l'URL (multi.php) et récupère le desc etc De son tableau. Pour une raison quelconque, au lieu de renvoyer des mots-clés ou des descriptions, il renvoie simplement "m". . . c'est un peu aléatoire et ça me gratte la tête. Voici ce que je suisPHP Multidimensional Arrays

<html> 
<head> 
    <title>Multi-Demensional Array</title> 
<?php 

$path = pathinfo($_SERVER['PHP_SELF']); 
$allyourbase = $path['basename']; 

$pages = array 
(
    "multi.php" => array 
    (
     "keywords" => "index, home, test, etc", 
     "desc"  => "This is the INDEX page", 
     "style"  => "index.css" 
    ), 

    "header.php" => array 
    (
     "keywords" => "showcase, movies, vidya, etc", 
     "desc"  => "SHOWCASE page is where we view vidya.", 
     "style"  => "showcase.css" 
    ) 
); 



?> 
</head> 
<body> 

<?php 

foreach($pages as $key => $value) 
{ 
    if($key == $allyourbase) 
    { 
     echo $key['desc']; 
    } 
} 

?> 

</body> 
</html> 
+0

Non aléatoire du tout, c'est un symptôme parce que les chaînes sont des tableaux de caractères en php. Donc, généralement, si vous obtenez un caractère lorsque vous attendez une phrase, vous devriez vérifier si vous appelez accidentellement une touche de tableau numérique sur une chaîne. – Kzqai

Répondre

2

La raison pour laquelle cela se produit est parce que PHP si je devais le code suivant:

$hello = 'world'; 

et je tentais de faire ce qui suit:

echo $hello[0]; 

PHP traiterait la chaîne comme tableau et me renvoie tout ce qui est en position 0, ce qui se traduirait par w, lorsque vous utilisez un foreach votre demander à PHP pour définir la clé du tableau à $key, et sa valeur à $value.

vous alors écho echo $key['desc'];, la valeur est une chaîne, php il considère comme un indice basé entier, il ignorera votre appel à desc puis retourner le premier indice, si vous deviez changer echo $key['desc']-echo $value['desc'] qui est un tableau basé sur le hachage, il retournera les résultats souhaités.

Vous devez simplement être en mesure de le faire:

if(isset($pages[$allyourbase])) 
{ 
    echo $pages[$allyourbase]['desc']; 
} 

Pas besoin de la boucle

+0

C'est génial. Bonne explication aussi qui a tout à fait du sens maintenant! Merci! –

1

essayer

echo $key['desc']; 

remplacer par

echo $value['desc']; 
0

Si je lis ce droit, echo $key['desc']; devrait être echo $value['desc'];.

1

D'autres personnes ont fourni des grandes solutions, mais il est important que vous comprenez exactement ce qui se passe ici, donc vous ne faites pas la même erreur à nouveau. Portez une attention particulière aux commentaires, et vous serez sur le chemin du codage réussi!

Voici ce qui se passe:

foreach ($pages as $key => $value) { 
    if ($key == $allyourbase) { 
     // At this point: $key = 'multi.php' 
     // Also: $value = array(...); 

     // Keep in mind: $key['desc'] = $key[0] = 'm'; 
     // You are grabbing the first letter of the 'multi.php' string. 

     // When dealing with strings, PHP sees $key['desc'] as $key[0], 
     // which is another way to grab the very first character of 'multi.php' 

     echo $key['desc']; 

     // You really want $pages[$key]['desc'], but below 
     // is a better way to do it, without the overhead of 
     // the loop. 
    } 
} 

Si vous avez conservé la boucle, ce qui est vraiment inutile, il ressemblerait à ceci:

foreach ($pages as $key => $value) { 
    if ($key == $allyourbase) { 
     echo $value['desc']; 
    } 
} 

La meilleure solution est de remplacer la boucle avec le Code suivant:

if (isset($pages[$allyourbase])) { 
    echo $pages[$allyourbase]['desc']; 
} else { 
    // error handling 
} 
+0

C'est aussi une excellente explication. Merci! Le "isset()" est-il vraiment nécessaire? –

+0

(Pas de problème, j'apprécie les commentaires.) À mon avis, oui. Si '$ pages [$ allyourbase]' n'est pas défini, il lancera une erreur 'Notice: Undefined index'.De plus, le gentleman extrait directement les informations de la variable '$ _SERVER ['PHP_SELF']' sans aucun filtrage. Cela permet également au gentleman d'implémenter le traitement des erreurs si quelqu'un demande une page qui n'a pas été définie. –

+0

ah gotcha. Merci! –