在php中获取多维数组中键的值

Posted

技术标签:

【中文标题】在php中获取多维数组中键的值【英文标题】:Getting out the value of a key in multidimentional array in php 【发布时间】:2018-12-05 05:30:24 【问题描述】:

在我的 php 查询中,我得到了这个输出:

"projects":["id":127,"name":"efrat","status":"id":10,"name":"development","label":"development","description":"","enabled":true,"view_state":"id":10,"name":"public","label":"public","access_level":"id":90,"name":"administrator","label":"administrator","custom_fields":["id":1,"name":"Customer email","type":"email","default_value":"","possible_values":"","valid_regexp":"","length_min":0,"length_max":50,"access_level_r":"id":10,"name":"viewer","label":"viewer","access_level_rw":"id":10,"name":"viewer","label":"viewer","display_report":true,"display_update":true,"display_resolved":true,"display_closed":true,"require_report":false,"require_update":false,"require_resolved":false,"require_closed":false],"versions":[],"categories":["id":93,"name":"Monitor","project":"id":0,"name":null,"id":31,"name":"Proactive","project":"id":0,"name":null,"id":30,"name":"Project","project":"id":0,"name":null,"id":29,"name":"Support","project":"id":0,"name":null]]

在使用 'json_decode' 方法后,我得到了: "(

[projects] => Array
    (
        [0] => Array
            (
                [id] => 127
                [name] => myprojectname
                [status] => Array
                    (
                        [id] => 10
                        [name] => development
                        [label] => development
                    )

                [description] =>
                [enabled] => 1
                [view_state] => Array
                    (
                        [id] => 10
                        [name] => public
                        [label] => public
                    )

                [access_level] => Array
                    (
                        [id] => 90
                        [name] => administrator
                        [label] => administrator
                    )

                [custom_fields] => Array
                    (
                        [0] => Array
                            (
                                [id] => 1
                                [name] => Customer email
                                [type] => email
                                [default_value] =>
                                [possible_values] =>
                                [valid_regexp] =>
                                [length_min] => 0
                                [length_max] => 50
                                [access_level_r] => Array
                                    (
                                        [id] => 10
                                        [name] => viewer
                                        [label] => viewer
                                    )

                                [access_level_rw] => Array
                                    (
                                        [id] => 10
                                        [name] => viewer
                                        [label] => viewer
                                    )

                                [display_report] => 1
                                [display_update] => 1
                                [display_resolved] => 1
                                [display_closed] => 1
                                [require_report] =>
                                [require_update] =>
                                [require_resolved] =>
                                [require_closed] =>
                            )

                    )

                [versions] => Array
                    (
                    )

                [categories] => Array
                    (
                        [0] => Array
                            (
                                [id] => 93
                                [name] => Monitor
                                [project] => Array
                                    (
                                        [id] => 0
                                        [name] =>
                                    )

                            )

                        [1] => Array
                            (
                                [id] => 31
                                [name] => Proactive
                                [project] => Array
                                    (
                                        [id] => 0
                                        [name] =>
                                    )

                            )

                        [2] => Array
                            (
                                [id] => 30
                                [name] => Project
                                [project] => Array
                                    (
                                        [id] => 0
                                        [name] =>
                                    )

                            )

                        [3] => Array
                            (
                                [id] => 29
                                [name] => Support
                                [project] => Array
                                    (
                                        [id] => 0
                                        [name] =>
                                    )

                            )

                    )

            )

    )

)"

在我的 PHP 中,如何从这个数组中释放“name”对象值(结果应该是 'myprojectname')?我尝试了许多 foreach 循环,但都无济于事。

谢谢,

【问题讨论】:

【参考方案1】:

看起来你有一个对象,解码后实际上只有一个数组项。因此,在您的情况下,“myprojectname”可能只是“$projects[0]['name']”

如果数组项很多,你可以

foreach ($projects as $project) 
  echo $project[‘name’];

编辑:我自己获取了提供的对象并对其进行了 json_decoded,它与 OP 提供的 json_decoded 项目不匹配——第一张图片显示了 var_dump 'name' OP 所需的代码,是代码也在下面:

$decoded = json_decode($obj);
$projects = $decoded->projects;
$name = $projects[0]->name;

【讨论】:

我也猜测它实际上是一个包含嵌套数组的数组。当我尝试你的建议时,我得到:“ PHP Notice: Undefined index: name” 好的,所以我得到了你的确切输出——一旦我对它进行 json_decode,'myprojectname' 就不存在了 谢谢,现在可以了,我想我的问题是使用“$projects=json_decode($result, true);”,当我把它改成“$projects=json_decode($result) ;"它奏效了。【参考方案2】:

您的“项目”包含一个数组 ("projects":["id":127, ... ])。我假设“项目”数组可能包含多个这样的“项目”对象?


    "projects":
    [
        
            "id":127,
            "name":"my-project"
        ,
        
            "id":128,
            "name":"my-other-project"
        
    ]

在这种情况下,您需要箭头符号来访问 name 属性,例如:

foreach ($projects as $project_object) 
    foreach ($project_object as $project) 
        echo $project->name . '<br/>';
    

编辑:

我拿了一个OP的最小代码示例并得到了预期的结果:

您能否在原始问题中的代码 sn-ps 中添加更多详细信息,或者向我们提供您的代码的工作示例? 有一些在线 PHP 沙箱可以帮助您解决这个问题。例如:我删除了所有似乎与您的问题无关的代码,并以两种不同的方式获得了您正在寻找的结果: http://sandbox.onlinephpfunctions.com/code/009c53671fd9545e4fcecfe4b0328974381ee2ce

总结您已经尝试过的所有 foreach 循环也是一个好主意,这样我们就可以看看您是否已经有了自己的解决方案。这样,我们可以更好地理解您的问题,并阻止我们提供您已经使用过的解决方案。

【讨论】:

projects 数组包含多个与这个项目相关的数组。当我尝试这个 foreach 循环时,我得到这个错误:“PHP 注意:尝试获取非对象的属性” “项目”中是否可能有多个数组或多个对象对我来说不是很清楚,所以我将基于我的观点现在你的第一个代码示例。您可以再尝试两个 foreach 循环吗?一个看起来像这样,是基于 Kat 之前的回答 -> foreach($projects as $project) echo $project[0]['name']; 另一个是 Kat 的方法和我的结合 -> foreach($projects as $project) echo $project[0]-&gt;name; 谢谢你,下次我会记住你的想法。我还使用了您使用的 php 沙箱,我编辑了 $raw 以匹配我的情况,正如您所看到的,我无法让它像您一样工作,因为我认为,我在数组中添加了一层。你能看看这个吗:sandbox.onlinephpfunctions.com/code/… 不客气。我在您的最后一个沙箱链接中看到您在变量$raw 中输入了错误的原始数据,json_decode 无法接受您在原始问题/帖子中的第二个代码 sn-p。 json_decode 函数会将其视为无效的 JSON,并将返回 NULL。它可以像这样完美地解码您的第一个代码 sn-p:sandbox.onlinephpfunctions.com/code/… 我认为您正在做一些额外的事情或者您的 json_decode 不正确,因为您不应该在沙盒链接中显示原始输出。 您在$raw 中输入的字符串在我看来就像一个 print_r。首先,您需要将正确的 JSON 放入该变量中,然后 json_decode 才能正确处理。

以上是关于在php中获取多维数组中键的值的主要内容,如果未能解决你的问题,请参考以下文章

PHP多维数组搜索并获取键的数组[重复]

php改变多维数组的值

PHP - 在多维数组中查找键

动态获取/设置多维数组中的值的函数

基于颜色键的多维数组排列顺序

通过键的多维数组获取数组值