【问题标题】:PHP 7 Multidimensional Array InitializationPHP 7 多维数组初始化
【发布时间】:2021-12-07 13:51:34
【问题描述】:

我可能在 10 年前编写了这些 PHP 脚本,最有可能在 PHP 4 上,但也可能在 3 上。 几年前我在他们身上工作并让他们在 PHP 5 上工作,但现在我的主机已经升级到 PHP 7,我抛出了数百甚至数千个未定义的偏移错误。我的印象是,如果我尝试将一个值加载到未定义的数组中,它将创建索引,但显然不是。所以我的解决方案是简单地创建空数组来避免这种情况。我只是想确定嵌套循环是否是唯一的解决方案。我们是幼儿园,对于我的第一个脚本,我的数组是这样的:

$childs_classroom[classroom][week][day_of_week]

课堂是 0-4、0-260 周和 0-4 周

当我尝试像这样增加一个数组时,它每次都会创建一个未定义的偏移错误(我相信)。除了嵌套循环之外,有没有更简单的方法来创建这个数组并用空值/零填充它,这样我就不会出错?如果这是基本的东西,我很抱歉,我忘记的 PHP 比我记得的 atm 更多。

【问题讨论】:

  • 你需要一个可重现的例子,这个$childs_classroom[1][2][3] = 'test';一直有效。
  • 我开始意识到,当我使用 PHP 4 时,不需要初始化或定义变量。在以后的版本中,这似乎成为了一项要求。在缩小错误日志后,我现在看到它首先抛出一个未定义的变量错误,然后似乎每次使用都会抛出未定义的索引错误。所以我想我现在在问,我将如何预先定义这个 $childs_classroom 变量?
  • 三个示例前两个有效,第三个无效,因为这些是尚未定义的常量。 3v4l.org/QjCAD你需要提供一个不起作用的例子。
  • 谢谢大家。我看到了一些很棒的想法。我正在出门去土耳其和希腊进行为期 3 周的旅行。我回来时会把这个拿回来。

标签: php arrays multidimensional-array


【解决方案1】:

您可以在 PHP7 中使用空合并运算符 (??) 绕过警告。示例:

echo $childs_classroom[classroom][week][day_of_week] ?? "N/A"

如果存在则打印该值,否则不适用

【讨论】:

  • 警告:使用未定义的常量教室 - 假定为“教室”(这将在 PHP 的未来版本中引发错误)警告:使用未定义的常量周 - 假定为“周”(本将在 PHP 的未来版本中引发错误)警告:使用未定义的常量 day_of_week - 假定为“day_of_week”(这将在 PHP 的未来版本中引发错误)
  • 假设您在代码中定义了它们。它只是取自问题...例如,如果它们是来自用户、数据库或循环的变量;你可以使用 echo $childs_classroom[$classroom][$week][$day_of_week] ?? “不适用”
【解决方案2】:

如果您分配嵌套数组,它们确实会自动创建(没有通知错误),但是由于您说 incrementing,听起来好像您正在访问初始化之前的值。使用$var++ 增加不存在的变量或键将导致警告,因为它等于$var = $var + 1,并且在变量存在之前计算右侧。

这可以通过首先将密钥设置为零来避免。

在 PHP7 中,一个简单的方法是使用$var ??= 0。这会将 $var 初始化为 0 如果它不包含非零值,但不会覆盖现有的非零值。

例如,以下代码将初始化一个数组键,然后将其递增两次,而不会发出 e_notice 警告。

$non_existent_array['non_existent']['key'] ??= 0;
$non_existent_array['non_existent']['key']++;

var_dump($non_existent_array);

$non_existent_array['non_existent']['key'] ??= 0;
$non_existent_array['non_existent']['key']++;

var_dump($non_existent_array);



array(1) {
  ["non_existent"]=>
  array(1) {
    ["key"]=>
    int(1)
  }
}
array(1) {
  ["non_existent"]=>
  array(1) {
    ["key"]=>
    int(2)
  }
}

【讨论】:

    猜你喜欢
    • 2015-08-01
    • 1970-01-01
    • 2023-01-27
    • 2013-04-04
    • 2011-04-03
    • 2015-07-20
    相关资源
    最近更新 更多