将PHP数组转换为HTML表单输入是重复项目

时间:2017-12-01 14:56:21

标签: php html arrays

我试图获取array个值并从这些值构建一个php表单。

数组位于底部以保持问题清晰。数组结构是:

- Item
- Item
- Item with Child   
        -Item 
        -Item
        - Item with Child   
            -Item 
            -Item

以下是我想要输出的每个item 但是如果项目有子项,只需输出父项的名称并为子项创建字段。

enter image description here

我创造了这个:

 function renderTest2(array $data)
    {
        $html = '<ul>';
        foreach ($data as $item) {
            $html .= '<li>';

            foreach ($item as $key => $value) {

                if (is_array($value)) {
                    $html .= renderTest2($value);
                } else {
                    if (array_key_exists('children', $item)) {
                        $html .= $item['name'];
                    } else {
                        $html .= $item['name'] . "<input type=\"text\" value=\"\"> <br/>";
                    }

                }
            }
            $html .= '</li>';
        }
        $html .= '</ul>';

        return $html;
    }

这给了我这个输出:

enter image description here

但我不明白为什么它会重复项目。我做错了什么?

这是我使用的测试数组:

$aFullArray = array();

$aFullArray[] = array("name" => "Adam", "address" => "123 main", "phone" => "000-000-0000");
$aFullArray[] = array("name" => "Beth", "address" => "123 main", "phone" => "000-000-0000");


    $aChildren = array();
    $aChildren [] = array("name" => "Mike", "address" => "123 main", "phone" => "000-000-0000");
    $aChildren[] = array("name" => "Nancy", "address" => "123 main", "phone" => "000-000-0000");


    $subChild = array();
    $subChild [] = array("name" => "Peter", "address" => "123 main", "phone" => "000-000-0000");
    $subChild [] = array("name" => "Paul", "address" => "123 main", "phone" => "000-000-0000");

    $aChildren [] = array("name"     => "Oscar", "address" => "123 main", "phone" => "000-000-0000",
                          "children" => $subChild);

    $aFullArray[] = array("name"     => "Charlie", "address" => "123 main", "phone" => "000-000-0000",
                          "children" => $aChildren);

    $aFullArray[] = array("name" => "Danny", "address" => "123 main", "phone" => "000-000-0000");

3 个答案:

答案 0 :(得分:2)

function renderTest2(array $data)
{
    $html = '<ul>';
    foreach ($data as $item) {
        $html .= '<li>';
        if (array_key_exists('children', $item)) {
            $html .= $item['name'];
            $html .= renderTest2($item['children']);
        } else {
            $html .= $item['name'] . "<input type='text' value=''> <br/>";
        }
        $html .= '</li>';
    }
    $html .= '</ul>';

    return $html;
}

你正在循环两次,这是不需要的,如果有孩子只传递子数组

<强>解释

  1. 循环遍历数组,如果它有children键,请执行recursion
  2. 如果没有找到生成li元素

答案 1 :(得分:0)

看着代码,我看到了以下错误:

foreach()执行foreach()所以多次foreach()循环就是你犯的错误。

试试这段代码:

仅调用foreach()一次并使用

if (array_key_exists('children', $item)) {
   $html .= $item['name'];
   $html .= renderTest2($item['children']);
}

在一个foreach()中,不需要双循环,并且避免recursion

完整的代码将是:

<?php
$aFullArray = array();


$aFullArray[] = array("name" => "Adam", "address" => "123 main", "phone" => "000-000-0000");
$aFullArray[] = array("name" => "Beth", "address" => "123 main", "phone" => "000-000-0000");


$aChildren = array();
$aChildren [] = array("name" => "Mike", "address" => "123 main", "phone" => "000-000-0000");
$aChildren[] = array("name" => "Nancy", "address" => "123 main", "phone" => "000-000-0000");


$subChild = array();
$subChild [] = array("name" => "Peter", "address" => "123 main", "phone" => "000-000-0000");
$subChild [] = array("name" => "Paul", "address" => "123 main", "phone" => "000-000-0000");

$aChildren [] = array("name"     => "Oscar", "address" => "123 main", "phone" => "000-000-0000",
    "children" => $subChild);

$aFullArray[] = array("name"     => "Charlie", "address" => "123 main", "phone" => "000-000-0000",
    "children" => $aChildren);

$aFullArray[] = array("name" => "Danny", "address" => "123 main", "phone" => "000-000-0000");

function renderTest2(array $data)
{
    $html = '<ul>';
    foreach ($data as $item) {
        $html .= '<li>';
        if (array_key_exists('children', $item)) {
            $html .= $item['name'];
            $html .= renderTest2($item['children']);
        } else {
            $html .= $item['name'] . "<input type='text' value=''> <br/>";
        }
        $html .= '</li>';
    }
    $html .= '</ul>';

    return $html;
}
echo renderTest2($aFullArray);

希望这有帮助!

答案 2 :(得分:0)

由于原始代码没有使用源数组中的各种元素,因此我简化了测试porpoises。希望以下内容有意义,它似乎以所需的方式生成列表。

$html = $family = $children_family_1 = $children_family_2 = array();




$family[] = array("name" => "Adam");
$family[] = array("name" => "Beth");
$family[] = array("name" => "Danny");

$children_family_2[] = array("name" => "Peter");
$children_family_2[] = array("name" => "Paul");

$children_family_1[] = array("name" => "Mike");
$children_family_1[] = array("name" => "Nancy");

$children_family_1[] = array("name" => "Oscar", "children" => $children_family_2 );
$family[] = array("name" => "Charlie", "children" => $children_family_1 );



function familytree( $input=array(),&$html ){
    $html[]='<ul>';
    foreach( $input as $index => $arr ){
        if( array_key_exists( 'children', $arr ) && is_array( $arr['children'] ) ){

            $html[]="<li>Parent: {$arr['name']}</li>";
            $html[]="<li>";

            /* recurse array to repeat structure */
            familytree( $arr['children'], &$html );

            $html[]="</li>";
        } else {
            $html[]="<li><input type='text' name='name[]' value='{$arr['name']}' /></li>";
        }
    }
    $html[]='</ul>';

    return implode( PHP_EOL, $html );
}

echo familytree( $family, $html );

生成的html:

<ul>
    <li><input type="text" name="name[]" value="Adam"></li>
    <li><input type="text" name="name[]" value="Beth"></li>
    <li><input type="text" name="name[]" value="Danny"></li>
    <li>Parent: Charlie</li>
    <li>
        <ul>
            <li><input type="text" name="name[]" value="Mike"></li>
            <li><input type="text" name="name[]" value="Nancy"></li>
            <li>Parent: Oscar</li>
            <li>
                <ul>
                    <li><input type="text" name="name[]" value="Peter"></li>
                    <li><input type="text" name="name[]" value="Paul"></li>
                </ul>
            </li>
        </ul>
    </li>
</ul>