首页  >  问答  >  正文

PHP - 如果元素的值不是字符串类型,则遍历对象会失败

<p>我有一个简单的问题,但是无论如何,我都无法弄清楚发生了什么。我有一个JSON字符串,看起来像这样:</p> <pre class="brush:php;toolbar:false;">{ "network_title": "Network", "class_title": "Class", "grades": [{ "number": "Pre-K", "label": "Pre-Kindergarten", "order": 1, "id": "34567" }, { "number": "TK", "label": "Transitional Kindergarten", "order": 2, "id": "23456" }, { "number": "K", "label": "Kindergarten", "order": 3, "id": "12345" }] }</pre> <p>它被转换为以下这样的数组(出于特定的原因):</p> <pre class="brush:php;toolbar:false;">array:3 [ "network_title" => "Network" "class_title" => "Class" "grades" => array:3 [ 0 => array:4 [ "number" => "Pre-K" "label" => "Pre-Kindergarten" "order" => 1 "gid" => "aa71da69-93ab-11e9-bda9-06f442b19d06" ] 1 => array:4 [ "number" => "TK" "label" => "Transitional Kindergarten" "order" => 2 "gid" => "d3c6754a-6298-48d0-9afa-6a19bafb8464" ] 2 => array:4 [ "number" => "K" "label" => "Kindergarten" "order" => 3 "gid" => "a815a771-9aff-4020-b7d2-0c95a05da21e" ] ] ]</pre> <p>然后我尝试遍历数组,当它找到一个元素的类型不是字符串(比如 order 元素)时,就会出现 Invalid argument supplied for foreach() 的错误。错误信息显示 foreach() 行是有问题的。以下是代码示例:</p> <pre class="brush:php;toolbar:false;">foreach ($arrTree as $k => $v) { if (is_string($v)) { //Do something here } }</pre> <p>我确定我在这里漏掉了一些基本的东西,但是我已经厌倦了寻找问题。谢谢。</p>
P粉769045426P粉769045426417 天前463

全部回复(1)我来回复

  • P粉615886660

    P粉6158866602023-07-31 15:41:35

    问题在于 $arrTree 是一个多维数组。

    您的代码中的 foreach 循环只遍历了数组的第一层,而没有遍历嵌套的数组(如 "grades")。当它遇到 "grades" 时,$v 的值不是字符串,而是一个数组,这就是为什么 is_string($v) 检查失败的原因。

    您需要添加一个嵌套的 foreach 循环来处理这个结构。

    以下是一个示例,展示了如何实现这一点:

    foreach ($arrTree as $k => $v)
    { 
        if (is_string($v)) 
        {
            //Do something here
        }
        else if (is_array($v))
        {
            foreach($v as $key => $value)
            {
                if(is_string($value))
                {
                    //Do something here
                }
                else if(is_array($value))
                {
                    foreach($value as $innerKey => $innerValue)
                    {
                        if(is_string($innerValue))
                        {
                            //Do something here
                        }
                    }
                }
            }
        }
    } 

    回复
    0
  • 取消回复