有一个数组:
$_admin_left_menu =
Array(
array(
"section_name" => "Контент1",
array(
"name" => "Контент",
"link" => "/news/",
"icon" => "default"
),
array(
"name" => "Контент",
"link" => "/news/",
"icon" => "default"
)
),
array(
"section_name" => "Контент2",
array(
"name" => "Контент",
"link" => "/news3/",
"icon" => "default"
)
)
);
接下来,我foreach只通过"section_name"以下代码输出:
foreach ($_admin_left_menu as $section_value) {
echo $section_value['section_name'] . "<br>";
}
我得到的输出是(Content1 和 Content2)。
然后我从同一个数组中输出,例如"link"下面的代码:
foreach ($_admin_left_menu as $section_value) {
echo $section_value['section_name'] . "<br>";
foreach ($section_value as $value) {
echo $value['link'] . "<br>";
}
}
它输出数据,但除此之外我得到这个 Illegal string offset 'name' in和�.
我将这个数组结构用于菜单,因此使用它会更容易,并且我手动输入数据。看完后才知道需要通过数组号来引用这样的行……$value[0]而且没有这样的警告!但�他留了下来。
当然,使用数组编号并不方便,而是使用数组索引,例如像这样['section_name']。
我想更详细地了解如何达到预期的结果?毕竟这样echo $value['section_name'];写更方便echo $value[0];
PHP Version 7.3.15
你的问题不在于php版本,而在于错误的数据结构。
因此,我们得到一个这样的循环:
是的,这种使用巨型阵列的方法并不完全合适。最好将所有这些包装在类中。至少在
Section和Link。UPD
如何使用,我想你会明白的。您需要自己添加的 getter 和 setter
在这里,他们已经就如何最好地做到这一点给出了很好的答案,以便一切正常。我将补充说明为什么您的原始版本不起作用。我认为这会有所帮助。这是您的代码:
该行将
echo $section_value['section_name'] . "<br>";正常工作,因为该数组$_admin_left_menu由 2 个数组 ($_admin_left_menu[0]和$_admin_left_menu[1]) 组成,并且每个数组都包含一个带有 index 的元素'section_name'。foreach但是黑暗的事情开始在你的内在发生。Foreach遍历数组$section_value并在每个元素中查找带有 index 的嵌套元素'link'。让我们看一下数组$_admin_left_menu[0](我们将其称为$section_value):它由3个元素组成。第一个有一个索引
"section_name"。您没有明确指定第二个和第三个元素的索引。所以 PHP 为它们分配了数字索引。(如果没有为数组元素显式指定键,PHP 使用整数键的前一个最大值加 1 作为键。如果显式为元素设置字符串索引,然后在没有显式索引的情况下将元素添加到数组中, PHP 将为其分配索引 0。)。这些元素本身就是数组,每个元素都包含一个位于 index 的$section_value[0]元素。对他们来说,您的代码将正常工作。但元素不是数组。这是一个字符串。但是您的内部仍然会尝试从中提取带有索引的元素$section_value[1]'link'$section_value['section_name']"Контент1"foreach'link'. 这将导致错误,因为只有数字可以作为字符串中的索引。上诉
$value[0]确实会消除错误,但你根本不会得到你想要的。"Контент1"您仅在行和中拥有索引为 0 的元素"Контент2"。从那里它将以 krakozyabra 的形式显示(俄语字母通常不会逐个字符地显示)。如果您分别用and替换"Контент1"and ,您将看到将打印该字母而不是 krakozyabr 。"Контент2""Content1""Content2"'C'