【问题标题】:PHP Multidimensional ArraysPHP 多维数组
【发布时间】:2011-09-22 11:21:03
【问题描述】:

我正在尝试制作一个通用脚本,将关键字添加到我的各个页面(因为标题在包含文件中)所以我得到了 url (multi.php) 的结尾并从中检索 desc 等大批。由于某种原因,它没有返回关键字或描述,而是只返回 "m" 。 . .这有点随机,让我摸不着头脑。这是我得到的

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

【问题讨论】:

  • 根本不是随机的,这是一种症状,因为字符串是 php 中的字符数组。所以一般来说,如果你在期待一个短语时得到一个字符,你应该检查你是否不小心调用了字符串上的数字数组键。

标签: php arrays loops foreach multidimensional-array


【解决方案1】:

发生这种情况的原因是因为在 PHP 中如果我有以下代码:

$hello = 'world';

我尝试执行以下操作:

echo $hello[0];

PHP 会将字符串视为数组并将位置 0 中的任何内容返回给我,这将导致 w,当您使用 foreach 时,您要求 PHP 将数组的键设置为 $key,它是值为$value

然后你回显echo $key['desc'];,因为该值是一个字符串,php 将它视为一个基于整数的索引,因此它将忽略你对desc 的调用,然后返回第一个索引,如果你要更改@987654328 @ to echo $value['desc'] 这是一个基于哈希的数组,它将返回所需的结果。

你应该能够做到这一点:

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

不需要循环

【讨论】:

  • 太好了。很好的解释,现在完全有道理!谢谢!
【解决方案2】:

试试

 echo $key['desc'];

替换为

echo $value['desc']; 

【讨论】:

    【解决方案3】:

    其他人提供了一些很好的解决方案,但重要的是您要准确了解这里发生的情况,这样您就不会再犯同样的错误。仔细关注 cmets,您将走上成功编码的道路!

    这是发生了什么:

    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
    }
    

    【讨论】:

    • 这也是一个很好的解释。谢谢! “isset()”真的有必要吗?
    • (没问题!感谢您的反馈。)在我看来,是的。如果未定义$pages[$allyourbase],则会抛出Notice: Undefined index 错误。此外,这位先生直接从$_SERVER['PHP_SELF'] 变量中提取信息,没有任何过滤。这也允许君子在有人请求一个尚未定义的页面时实现错误处理。
    【解决方案4】:

    如果我没看错,echo $key['desc']; 应该是 echo $value['desc'];

    【讨论】:

      猜你喜欢
      • 2011-09-20
      • 2022-01-07
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多