【问题标题】:Is this a bug in PHP? [duplicate]这是PHP中的错误吗? [复制]
【发布时间】:2012-07-10 14:53:18
【问题描述】:

可能重复:
php array behaving strangely with key value 07 & 08

我在 PHP 中发现了一些奇怪的东西,如果我使用数字数组,第 8 个数组会被忽略,这里当我将 'Cherry' 放入 $fruit[08] 时,php 接缝会越过它。

发生了什么事?这是一个错误还是其他什么。

<pre>
<?php

$fruit[01] = "Apples";
$fruit[02] = "Pears";
$fruit[03] = "Bananas";
$fruit[04] = "Grape";
$fruit[05] = "Orange";
$fruit[06] = "Peach";
$fruit[07] = "Lemon";
$fruit[08] = "Cherry";
$fruit[09] = "Mango";

print_r($fruit);

?>
</pre>

输出:

Array
(
    [1] => Apples
    [2] => Pears
    [3] => Bananas
    [4] => Grape
    [5] => Orange
    [6] => Peach
    [7] => Lemon
    [0] => Mango
)

【问题讨论】:

  • 几乎可以肯定是“别的东西”。打印数组的输出是什么?
  • 尝试设置不带0(零)的数组索引

标签: php


【解决方案1】:

由于前导零,您的索引被视为八进制数。

0809 都将被评估为零,因此您的最后一个条目(“Mango”)最终位于数组索引 0 中。

【讨论】:

  • @Mahn 几乎所有其他语言也是如此 - PHPism 是它默默地将值转换为零。
  • @Alnitak:“默默地将值转换为零” - 关闭。实际上,它会忽略八进制数中无效数字之后的所有内容。 080,但 01585015 (13)。
【解决方案2】:

08 被视为八进制。

不要使用前导零。

就此而言,不要使用显式索引来创建数组:

$fruit = array(
           "Apples",
           "Pears",
           etc
         );

(或 PHP 5.4 及更新版本):

$fruit = [
           "Apples",
           "Pears",
           etc
         ];

【讨论】:

    【解决方案3】:

    因为您输入的是 08 而不是 8,所以 PHP 认为您在谈论一个不存在的值。八进制数从 00 到 07。要让 PHP 为您处理这些值,请键入:

    <pre>
    <?php
    
    $fruit[] = "Apples";
    $fruit[] = "Pears";
    $fruit[] = "Bananas";
    $fruit[] = "Grape";
    $fruit[] = "Orange";
    $fruit[] = "Peach";
    $fruit[] = "Lemon";
    $fruit[] = "Cherry";
    $fruit[] = "Mango";
    
    print_r($fruit);
    
    ?>
    </pre>
    

    简而言之,这不是一个错误,但如果您没有预料到,它会是您发现的其中一个问题。

    【讨论】:

      【解决方案4】:

      您正在为数组索引使用八进制表示法。 09 和 09 是无效的八进制数(十进制的 8 是八进制的 010,十进制的 9 是八进制的 011)。无效数字被评估为 0,因此“Cherry”将被“Mango”覆盖。

      【讨论】:

        【解决方案5】:

        数值数组不需要前导零。如果这给您带来了问题,请从索引中删除所有前导零。此外,您可以使用 $array[] 将元素附加到数组中,而不是实际给出索引。

        【讨论】:

          【解决方案6】:

          当整数以零开头时,PHP 将整数视为八进制而不是小数。尝试使用适当的索引,例如1、2、3 而不是 01、02、03。

          顺便说一句,PHP 数组从 0 开始。

          【讨论】:

            【解决方案7】:

            由于前导“0”,PHP 将您的数组索引视为八进制而不是十进制数字。删除这些,一切都应该正常!

            此外,您可能很清楚这一点,但万一您不知道,数组索引从 0 开始,而不是 1。

            【讨论】:

              【解决方案8】:

              这是因为您使用的是 01、02、03 等(前导零)。对于 PHP,这些是八进制数。而八进制数的范围是 0-7(所以 08 和 09 实际上是非法数字)。

              去掉前导零,一切都很好;)

              【讨论】:

                猜你喜欢
                • 2019-01-22
                • 2019-08-09
                • 1970-01-01
                • 1970-01-01
                • 2018-01-16
                • 1970-01-01
                • 2013-08-09
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多