【问题标题】:Print nested array as list将嵌套数组打印为列表
【发布时间】:2019-09-06 08:59:25
【问题描述】:

尝试将嵌套数组打印为列表:

$result = $connection->query($query);
$data = array();
while ($row = $result->fetch_object()) {
    $data[$row->global_id] = $row;
}

$roots = array();
foreach ($data as $row) {   
    if ($row->parent_global_id === null) {
        $roots[]= $row;
    } else {
        $data[$row->parent_global_id]->children[] = $row;
    }
    unset($row->parent_global_id);
    unset($row->global_id);
}

function array2ul($array) {
    $out = "<ul>";
    foreach($array as $key => $elem){
        if(!is_array($elem)){
                $out .= "<li><span>$key:[$elem]</span></li>";
        }
        else $out .= "<li><span>$key</span>".array2ul($elem)."</li>";
    }
    $out .= "</ul>";
    return $out; 
}

array2ul($roots)

产生错误

可捕获的致命错误:stdClass 类的对象无法在线转换为字符串

$out .= "<li><span>$key:[$elem]</span></li>";

所以它是一个对象,但我应该怎么做才能解决这个问题?

数组是这样的:

Array
(
    [0] => stdClass Object
        (
            [name] => MD
            [children] => Array
                (
                    [0] => stdClass Object
                        (
                            [name] => Year 1
                            [children] => Array
                                (
                                    [0] => stdClass Object
                                        (
                                            [name] => Integrated Medical Sciences 1
                                        )

                                    [1] => stdClass Object
                                        (
                                            [name] => Integrated Medical Sciences 2
                                        )
                                )
                        )

                    [1] => stdClass Object
                        (
                            [name] => Year 2
                            [children] => Array
                                (
                                    [0] => stdClass Object
                                        (
                                            [name] => Integrated Medical Practice 1
                                            [children] => Array
                                                (
                                                    [0] => stdClass Object
                                                        (
                                                            [name] => Centralised Teaching
                                                            [children] => Array
                                                                (
                                                                    [0] => stdClass Object
                                                                        (
                                                                            [name] => Seminar - General Medicine Student Led Presentations
                                                                        )

                                                                    [1] => stdClass Object
                                                                        (
                                                                            [name] => Surgery - CBL
                                                                        )
                                                                )
                                                        )

更新

尝试了以下方法:

function walk($array){  
    foreach ($array as $key => $value) {
        echo "<ul>";
        if(!is_array($value->name)){
            echo "<li>$key:[$value->name]</li>";

            walk($value);
        }
        echo "</ul>";
    }
}

walk($roots)

产生:

0:[MD]

    Notice: Trying to get property of non-object in /var/www/html/md/json/generate_json_by_year_print.php on line 65 Notice: Trying to get property of non-object in /var/www/html/md/json/generate_json_by_year_print.php on line 66
    name:[]
    Warning: Invalid argument supplied for foreach() in /var/www/html/md/json/generate_json_by_year_print.php on line 63 

    Notice: Trying to get property of non-object in /var/www/html/md/json/generate_json_by_year_print.php on line 65 Notice: Trying to get property of non-object in /var/www/html/md/json/generate_json_by_year_print.php on line 66
    children:[]
        0:[Year 1]
            Notice: Trying to get property of non-object in /var/www/html/md/json/generate_json_by_year_print.php on line 65 Notice: Trying to get property of non-object in /var/www/html/md/json/generate_json_by_year_print.php on line 66
            name:[]
            Warning: Invalid argument supplied for foreach() in /var/www/html/md/json/generate_json_by_year_print.php on line 63 
            Notice: Trying to get property of non-object in /var/www/html/md/json/generate_json_by_year_print.php on line 65 Notice: Trying to get property of non-object in /var/www/html/md/json/generate_json_by_year_print.php on line 66
            children:[]
                0:[Integrated Medical Sciences 1]
                    Notice: Trying to get property of non-object in /var/www/html/md/json/generate_json_by_year_print.php on line 65 Notice: Trying to get property of non-object in /var/www/html/md/json/generate_json_by_year_print.php on line 66
                    name:[]
                    Warning: Invalid argument supplied for foreach() in /var/www/html/md/json/generate_json_by_year_print.php on line 63 
                1:[Integrated Medical Sciences 2]
                    Notice: Trying to get property of non-object in /var/www/html/md/json/generate_json_by_year_print.php on line 65 Notice: Trying to get property of non-object in /var/www/html/md/json/generate_json_by_year_print.php on line 66
                    name:[]
                    Warning: Invalid argument supplied for foreach() in /var/www/html/md/json/generate_json_by_year_print.php on line 63 
        1:[Year 2]
            Notice: Trying to get property of non-object in /var/www/html/md/json/generate_json_by_year_print.php on line 65 Notice: Trying to get property of non-object in /var/www/html/md/json/generate_json_by_year_print.php on line 66
            name:[]
            Warning: Invalid argument supplied for foreach() in /var/www/html/md/json/generate_json_by_year_print.php on line 63 
            Notice: Trying to get property of non-object in /var/www/html/md/json/generate_json_by_year_print.php on line 65 Notice: Trying to get property of non-object in /var/www/html/md/json/generate_json_by_year_print.php on line 66
            children:[]
                0:[Integrated Medical Practice 1]
                    Notice: Trying to get property of non-object in /var/www/html/md/json/generate_json_by_year_print.php on line 65 Notice: Trying to get property of non-object in /var/www/html/md/json/generate_json_by_year_print.php on line 66
                    name:[]

第 66 行是echo "&lt;li&gt;$key:[$value-&gt;name]&lt;/li&gt;";

【问题讨论】:

  • 您能否提供一些示例数据以供使用 - 以及您期望它输出的内容。
  • 在哪一行显示错误?
  • 查看更新的 OP..
  • 尝试将$result->fetch_object()改为$result->fetch_assoc()
  • 您在与@Tenderfoot 合作吗?他在 15 分钟前问了一个类似的问题。

标签: php arrays


【解决方案1】:

你的数组元素是对象,你需要打印name属性。

                $out .= "<li><span>$key:[$elem->name]</span></li>";

【讨论】:

  • 您应该在答案中发布解决方案,而不是问题。如果它没有真正解决问题,请不要接受我的回答。
【解决方案2】:
foreach($array as $key => $elem){
    if(is_array($elem)){
        $out .= "<li><span>$key</span>".array2ul($elem)."</li>";
    }
    elseif(is_object($elem)){
        $out .= "<li><span>$key:[$elem->name]</span></li>";
        $out .= "<li><span>$key</span>".array2ul($elem->children)."</li>";
    }
    else{
        $out .= "<li><span>$key:[$elem]</span></li>";
    }
}

【讨论】:

    【解决方案3】:

    $elem 可能是一个对象。 当你检查$elem的类型时

        if(!is_array($elem)){
                $out .= "<li><span>$key:[$elem]</span></li>";
        }
        else $out .= "<li><span>$key</span>".array2ul($elem)."</li>";
    

    您还需要检查is_object($elem)。一个对象的 var_dump 会产生一个包含第一个元素的数组:

    [0] => stdClass Object
    

    首先,您必须在类中实现 __toString() 方法,以便将这些类的对象自动转换为字符串。 Where and why do we use __toString() in PHP?

    之后你可以简单地:

        if (is_array($elem))
            $out .= "<li><span>$key</span>".array2ul($elem)."</li>";
        else
            $out .= "<li><span>$key:[$elem]</span></li>";
    

    因为实现了类的__toString()

    【讨论】:

    • A.Rosano...toString() 在哪里实现?
    • 你必须在你从数据库中提取的对象类中实现它
    【解决方案4】:

    我正在处理这个问题:

    function walk($array)
    {    
        //convert object to key-value array
        if (is_object($array)) {
            $array = (array)$array;
        }
    
        $pdf_result = "<ul>";
        foreach ($array as $key => $value) {
            if (is_int($value) || is_string($value)) {
                $pdf_result .=  "<li>" . $value;            
            } elseif (is_array($value) || is_object($value)) {
                $pdf_result .= walk($value);
            }
            $pdf_result .=  "</li>";
        }
        $pdf_result .=  "</ul>";
    
        // Here we return result array
        return $pdf_result;
    }
    
    walk($roots);
    
    // And here we set another-scope variable from function
    $pdf_result = walk($roots);
    

    【讨论】:

      猜你喜欢
      • 2012-11-26
      • 2018-07-04
      • 2020-08-25
      • 2017-05-24
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多