从php数组创建html选择列表?

时间:2013-11-04 18:26:25

标签: php arrays select

您好我找到了从数组中输出html选择列表的php函数。

function buildTree(Array $data, $parent = 0) {
    $tree = array();
    foreach ($data as $d) {
        if ($d['parent'] == $parent) {
            $children = buildTree($data, $d['id']);
            // set a trivial key
            if (!empty($children)) {
                $d['_children'] = $children;
            }
            $tree[] = $d;
        }
    }
    return $tree;
}


$rows = array(
    array ('id' => 1, 'name' => 'Test 1', 'parent' => 0),
    array ('id' => 2, 'name' => 'Test 1.1', 'parent' => 1),
    array ('id' => 3, 'name' => 'Test 1.2', 'parent' => 1),
    array ('id' => 4, 'name' => 'Test 1.2.1', 'parent' => 3),
    array ('id' => 5, 'name' => 'Test 1.2.2', 'parent' => 3),
    array ('id' => 6, 'name' => 'Test 1.2.2.1', 'parent' => 5),
    array ('id' => 7, 'name' => 'Test 2', 'parent' => 0),
    array ('id' => 8, 'name' => 'Test 2.1', 'parent' => 7),
);

$tree = buildTree($rows);
// print_r($tree);

function printTree($tree, $r = 0, $p = null) {
  foreach ($tree as $i => $t) {
    $dash = ($t['parent'] == 0) ? '' : str_repeat('-', $r) .' ';
    printf("\t<option value='%d'>%s%s</option>\n", $t['id'], $dash, $t['name']);
    if ($t['parent'] == $p) {
        // reset $r
        $r = 0;
    }
    if(isset($t['_children'])){
        printTree($t['_children'], ++$r, $t['parent']);
    }
  }
}


print("<select>\n");
printTree($tree);
print("</select>");

但是我需要重写以返回这样的结果:

$select = "<select>";
$select .= printTree($list);
$select .= "</select>";

echo $select;
// or better
return $select;

问题在于递归,解决方案是填充数组中的每个选项,但我不知道如何在递归函数中执行此操作,还

printf("\t<option value='%d'>%s%s</option>\n", $t['id'], $dash, $t['name']);

在foreach循环迭代时直接打印。

感谢。

1 个答案:

答案 0 :(得分:0)

所以我弄清楚我的错误在哪里,那只是因为我用html选项标签填充数组,例如。

<option value="0">Start</option>

但是使用php函数print_r(),当我检查DOM元素时,我在数组值中看不到任何内容。

所以这是我的最终解决方案: 此函数填充多维数组中的值,以满足进一步的需求

# edited printTree() function, renamed to toSEL()
# $array - data array like above, 
# $r - to correct iterate, $p - parent id, 
# $currentID - what id is selected

function toSEL($array, $r = 0, $p = null, $currentID=null){
    foreach($array as $value){
        $dash = ($value[parent] == 0) ? '' : str_repeat('-', $r) .' ';
        if($value[id]==$currentID){
            $html[] = '<option value="'.$value[id].'" selected="selected">'.$dash.$value[name].'</option>';
        }else{
            $html[] = '<option value="'.$value[id].'">'.$dash.$value[name].'</option>';
        }

        if($value['parent'] == $p){
            // reset $r
            $r = 0;
        }
        if(!empty($value[children])){
            $html[] = toSEL($value[children], ++$r, $value[parent], $currentID);

        }

    }

    return $html;
}

从多维数组转换为一维

$aNonFlat = toSEL($list, 0, null, $currentID);

$result = array();
array_walk_recursive($aNonFlat,function($v, $k) use (&$result){ $result[] = $v; });

然后如果需要输出HTML使用一些简单的循环。

$html = '<select>';
foreach($result as $res){
    $html .= $res;  
}
$html .='</select>';
echo $html;