我试图获取array
个值并从这些值构建一个php表单。
数组位于底部以保持问题清晰。数组结构是:
- Item
- Item
- Item with Child
-Item
-Item
- Item with Child
-Item
-Item
以下是我想要输出的每个item
但是如果项目有子项,只需输出父项的名称并为子项创建字段。
我创造了这个:
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;
}
这给了我这个输出:
但我不明白为什么它会重复项目。我做错了什么?
这是我使用的测试数组:
$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");
答案 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;
}
你正在循环两次,这是不需要的,如果有孩子只传递子数组
<强>解释强>
children
键,请执行recursion
答案 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>