2011-06-25 16 views
0

私は個々のページにキーワードを追加する汎用スクリプトを作成しようとしています(ヘッダーはインクルードファイルに入っているので)ので、url(multi.php)の最後を取得して、descなどを取得しています。それは配列からです。何らかの理由で、代わりにキーワードや説明を返す代わりに、単に "m"を返します。 。 。それはランダムなもので、私の頭を傷つけています。ここで私はPHP多次元配列

<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

文字列はPHPの文字配列であるため、まったくランダムではありません。だから一般的に、文字列を期待しているときに文字を取得した場合は、誤って文字列の数値配列キーを呼び出すかどうかを確認する必要があります。 – Kzqai

答えて

2

理由がある

echo $hello[0]; 

PHPはとして文字列を扱うだろう配列を返し、位置0にあるものを返します。wという結果になります。配列のキーを$keyに設定するためにPHPにforeachを使用すると、値は$valueになります。

あなたは、値が文字列であるとして、PHPは整数ベースの指標としてそれを見ているので、あなたがecho $value['desc']echo $key['desc']を変更した場合、それは、descのためにあなたの呼び出しを無視して、最初のインデックスを返します、echo $key['desc'];エコーハッシュベースの配列は、必要な結果を返します。

あなただけのこの操作を行うことができる必要があります:

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

+0

それは素晴らしいです。今でも完全に理解できる良い説明です!ありがとう! –

1

を得たものだと、私はこの権利を読んでいる場合は、echo $key['desc'];echo $value['desc'];あるべき

echo $value['desc']; 
0

と交換

echo $key['desc']; 

を試してみてください。

$hello = 'world'; 

と私は次の操作を行うことを試み:PHPで私は、次のコードを持っていた場合ので、なぜこれが起こっている

1

他の人々はいくつかの素晴らしいソリューションを提供しているループのための必要はありませんが、それはあなたがそう、ここで起こっている正確に理解することが重要ですもう一度同じミスをしないでください。コメントに細心の注意を払うと、コーディングに成功するでしょう!ここで

は何が起こっているかです:

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. 
    } 
} 

あなたが本当に不要なループを、保持していた場合、それは次のようになります。

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

最善の解決策は、ループを交換することです次のコード:

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

それはまた素晴らしい説明です。ありがとう!しかし、 "isset()"は本当に必要ですか? –

+0

(問題ありません!私はフィードバックに感謝します。)私の意見では、はい。 '$ pages [$ allyourbase]'が定義されていないと、 'Notice:Undefined index'というエラーがスローされます。さらに、紳士はフィルタリングせずに '$ _SERVER ['PHP_SELF']'変数から直接情報を引き出しています。これにより、誰かが定義されていないページを要求している場合に、紳士がエラー処理を実装することも可能になります。 –

+0

ああ。ありがとう! –