Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在php中使用嵌套数组和对象的递归函数?_Php_Arrays_Recursion_Simplexml - Fatal编程技术网

如何在php中使用嵌套数组和对象的递归函数?

如何在php中使用嵌套数组和对象的递归函数?,php,arrays,recursion,simplexml,Php,Arrays,Recursion,Simplexml,我使用simplexmlelement在foreach循环中输出了这样一个数组 array(16) { ["Binding"]=> string(11) "Electronics" ["Brand"]=> string(8) "Micromax" ["Feature"]=> array(4) { [0]=> string(29) "80 centimeters LED 1366 x 768" [1]=> str

我使用simplexmlelement在foreach循环中输出了这样一个数组

array(16) {
  ["Binding"]=>
  string(11) "Electronics"
  ["Brand"]=>
  string(8) "Micromax"
  ["Feature"]=>
  array(4) {
    [0]=>
    string(29) "80 centimeters LED 1366 x 768"
    [1]=>
    string(55) "Connectivity - Input: HDMI*1, USB*1, Component*1, VGA*1"
    [2]=>
    string(405) "Installation: For requesting installation/wall mounting/demo of this product once delivered, please directly call Micromax support on 1860-500-8899."
    [3]=>
    string(88) "Warranty Information: 1 year warranty provided by the manufacturer from date of purchase"
  }
  ["ItemDimensions"]=>
  object(SimpleXMLElement)#300 (4) {
    ["Height"]=>
    string(4) "1693"
    ["Length"]=>
    string(4) "2898"
    ["Weight"]=>
    string(4) "1213"
    ["Width"]=>
    string(3) "315"
  }
  ["Label"]=>
  string(8) "Micromax"
  ["Manufacturer"]=>
  string(8) "Micromax"
  ["Model"]=>
  string(10) "32T7250MHD"
  ["MPN"]=>
  string(14) "MCX_32T7250MHD"
  ["PackageDimensions"]=>
  object(SimpleXMLElement)#301 (4) {
    ["Height"]=>
    string(3) "680"
    ["Length"]=>
    string(4) "3250"
    ["Weight"]=>
    string(4) "2015"
    ["Width"]=>
    string(4) "2260"
  }
  ["PackageQuantity"]=>
  string(1) "1"
  ["PartNumber"]=>
  string(14) "MCX_32T7250MHD"
  ["ProductGroup"]=>
  string(2) "CE"
  ["ProductTypeName"]=>
  string(10) "TELEVISION"
  ["Publisher"]=>
  string(8) "Micromax"
  ["Studio"]=>
  string(8) "Micromax"
  ["Title"]=>
  string(52) "Micromax 32T7250MHD 80cm (32 inches) HD Ready LED TV"
}
我使用一个递归函数来输出从这个数组到html的几乎所有内容。我的递归函数如下所示:

function recurseTree($var){
  $out = '<li>';
  foreach($var as $k=>$v){
    if( is_array($v) || is_object($v) ){
      $out .= '<ul>'.recurseTree($v).'</ul>';
    }else{
      $out .= '<li>' .$k .': ' .$v .'</li>';
    }
  }
  return $out.'</li>';
}
<ul>
    <li></li>
    <li>Binding: Electronics</li>
    <li>Brand: Micromax</li>
    <ul>
        <li></li>
        <li>0: 80 centimeters LED 1366 x 768</li>
        <li>1: Connectivity - Input: HDMI*1, USB*1, Component*1, VGA*1</li>
        <li>2: Installation: For requesting installation/wall mounting/demo of this product once delivered, please directly call Micromax support on 1860-500-8899.</li>
        <li>3: Warranty Information: 1 year warranty provided by the manufacturer from date of purchase</li>
    </ul>
    <ul>
        <li>
            <ul>
                <li></li>
            </ul>
            <ul>
                <li></li>
            </ul>
            <ul>
                <li></li>
            </ul>
            <ul>
                <li></li>
            </ul>
        </li>
    </ul>
    <li>Label: Micromax</li>
    <li>Manufacturer: Micromax</li>
    <li>Model: 32T7250MHD</li>
    <li>MPN: MCX_32T7250MHD</li>
    <ul>
        <li>
            <ul>
                <li></li>
            </ul>
            <ul>
                <li></li>
            </ul>
            <ul>
                <li></li>
            </ul>
            <ul>
                <li></li>
            </ul>
        </li>
    </ul>
    <li>PackageQuantity: 1</li>
    <li>PartNumber: MCX_32T7250MHD</li>
    <li>ProductGroup: CE</li>
    <li>ProductTypeName: TELEVISION</li>
    <li>Publisher: Micromax</li>
    <li>Studio: Micromax</li>
    <li>Title: Micromax 32T7250MHD 80cm (32 inches) HD Ready LED TV</li>
</ul>
function recurseTree($var){
    $output = '';
    foreach($var as $k=>$v){
        if( is_array($v) || is_object($v) ){
            $output .= '<li>' . $k . '<ul>'.recurseTree($v).'</ul></li>';
        }else{
            $output .= '<li>' .$k .': ' .$v .'</li>';
        }
    }
    return $output;
}
如何使用递归函数输出这些对象?还请注意,数组的键名称也丢失(例如:名称
[“功能”]
未显示在输出中)


如何输出这些丢失的数据?谢谢。

数组的键没有出现,因为在查找数组/对象时,您根本没有在if条件下使用它们。我会将函数修改为如下内容:

function recurseTree($var){
  $out = '<li>';
  foreach($var as $k=>$v){
    if( is_array($v) || is_object($v) ){
      $out .= '<ul>'.recurseTree($v).'</ul>';
    }else{
      $out .= '<li>' .$k .': ' .$v .'</li>';
    }
  }
  return $out.'</li>';
}
<ul>
    <li></li>
    <li>Binding: Electronics</li>
    <li>Brand: Micromax</li>
    <ul>
        <li></li>
        <li>0: 80 centimeters LED 1366 x 768</li>
        <li>1: Connectivity - Input: HDMI*1, USB*1, Component*1, VGA*1</li>
        <li>2: Installation: For requesting installation/wall mounting/demo of this product once delivered, please directly call Micromax support on 1860-500-8899.</li>
        <li>3: Warranty Information: 1 year warranty provided by the manufacturer from date of purchase</li>
    </ul>
    <ul>
        <li>
            <ul>
                <li></li>
            </ul>
            <ul>
                <li></li>
            </ul>
            <ul>
                <li></li>
            </ul>
            <ul>
                <li></li>
            </ul>
        </li>
    </ul>
    <li>Label: Micromax</li>
    <li>Manufacturer: Micromax</li>
    <li>Model: 32T7250MHD</li>
    <li>MPN: MCX_32T7250MHD</li>
    <ul>
        <li>
            <ul>
                <li></li>
            </ul>
            <ul>
                <li></li>
            </ul>
            <ul>
                <li></li>
            </ul>
            <ul>
                <li></li>
            </ul>
        </li>
    </ul>
    <li>PackageQuantity: 1</li>
    <li>PartNumber: MCX_32T7250MHD</li>
    <li>ProductGroup: CE</li>
    <li>ProductTypeName: TELEVISION</li>
    <li>Publisher: Micromax</li>
    <li>Studio: Micromax</li>
    <li>Title: Micromax 32T7250MHD 80cm (32 inches) HD Ready LED TV</li>
</ul>
function recurseTree($var){
    $output = '';
    foreach($var as $k=>$v){
        if( is_array($v) || is_object($v) ){
            $output .= '<li>' . $k . '<ul>'.recurseTree($v).'</ul></li>';
        }else{
            $output .= '<li>' .$k .': ' .$v .'</li>';
        }
    }
    return $output;
}
函数recurseTree($var){
$output='';
foreach($var为$k=>$v){
if(is_数组($v)| is_对象($v)){
$output.='
  • '.$k.
      '.recurseTree($v)。'
  • '; }否则{ $output.='
  • '.$k.'.$v.
  • '; } } 返回$output; }

    至于为什么不返回对象键/值,我不太确定。我已经用SimpleXmlElement对象和stdClass对此进行了测试,它们都工作得很好

    @georaldc数组键现在在我使用修改后的函数后出现。但是这些嵌套数组的值仍然没有出现在输出中。@fusion3k您是否使用我在问题中给出的数组进行了测试?我怀疑数组中有问题,因为我没有得到嵌套数组的值。发布从xml读取开始的代码和原始xml(或指向它的URL)@georaldc和@fusion3k我刚才在@georaldc answer上进行了扩展,并在
    if
    条件中添加了
    $v
    ,作为:“$out.=”
  • “.$k.
      ”.recurseTree($v)。“
    ”.$v.
  • ;”现在它显示了价值。我可以将@georladc响应标记为可接受的解决方案。一个相关的小问题。。如何能够同时输出属性?如果您正在处理xml对象,那么如何输出属性?在处理simplexml对象时,可能需要扩展该函数,并在该条件中使用类似SimpleXMLElement::attributes的内容。