RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1107517
Accepted
Максим Сиваконь
Максим Сиваконь
Asked:2020-04-09 02:59:12 +0000 UTC2020-04-09 02:59:12 +0000 UTC 2020-04-09 02:59:12 +0000 UTC

错误:警告:非法字符串偏移量如何解析?

  • 772

有一个数组:

$_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
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    ArchDemon
    2020-04-09T15:02:23Z2020-04-09T15:02:23Z

    你的问题不在于php版本,而在于错误的数据结构。

    $_admin_left_menu = [
        [
            "section_name" => "Контент1",
            "links" => [
                [
                    "name" => "Контент",
                    "link" => "/news/",
                    "icon" => "default"
                ],
                [
                    "name" => "Контент",
                    "link" => "/news/",
                    "icon" => "default"
                ],
            ]
        ], 
        [
            "section_name" => "Контент2",
            "links" => [
                [
                    "name" => "Контент",
                    "link" => "/news3/",
                    "icon" => "default"
                ],
            ]
        ],
    ];
    

    因此,我们得到一个这样的循环:

    foreach ($_admin_left_menu as $section_value) {
        echo $section_value['section_name'] . "<br>";
        foreach ($section_value['links'] as $value) {
            echo $value['link'] . "<br>";
        }
    }
    

    是的,这种使用巨型阵列的方法并不完全合适。最好将所有这些包装在类中。至少在Section和Link。

    UPD

    class Section {
    
        /** @var string */
        private $name;
    
        /** @var Link[] */
        private $links;
    
        public __construct($name, array $links) {
            $this->name = $name;
            $this->links = $links;
        } 
    }
    
    class Link {
        private $name;
        private $url;
        private $icon;
    
        public __construct($name, $url, $icon) {
            $this->name = $name;
            $this->url= $url;
            $this->icon = $icon;
        } 
    }
    

    如何使用,我想你会明白的。您需要自己添加的 getter 和 setter

    • 2
  2. Yury Plinto
    2020-04-09T20:22:16Z2020-04-09T20:22:16Z

    在这里,他们已经就如何最好地做到这一点给出了很好的答案,以便一切正常。我将补充说明为什么您的原始版本不起作用。我认为这会有所帮助。这是您的代码:

    foreach ($_admin_left_menu as $section_value) {
        echo $section_value['section_name'] . "<br>";
        foreach ($section_value as $value) {
            echo $value['link'] . "<br>";
        }
    }
    

    该行将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):

    array(
                "section_name" => "Контент1",
                array(
                    "name" => "Контент",
                    "link" => "/news/",
                    "icon" => "default"
                ),
                array(
                    "name" => "Контент",
                    "link" => "/news/",
                    "icon" => "default"
                )
            )
    

    它由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'

    • 1

相关问题

  • mysqli 类的对象无法转换为字符串

  • 您的系统中缺少 ext-http *,您的系统中缺少 ext-mysql_xdevapi *

  • 如何从csv中删除bom?

  • 当我按下 Enter 键时,如何让 PhpStorm 的 Emmet 插件触发,就像 VS Code 一样?

  • 注释在 Symfony5 中不起作用

  • 搜索最近的地理位置点

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5