質問する
8531 次
8 に答える
6
次のような反復をカウントするパラメータを渡します$pass
function toUL ($arr, $pass = 0) {
$html = '<ul>' . PHP_EOL;
foreach ( $arr as $v ) {
$html.= '<li>';
$html .= str_repeat("--", $pass); // use the $pass value to create the --
$html .= $v['name'] . '</li>' . PHP_EOL;
if ( array_key_exists('children', $v) ) {
$html.= toUL($v['children'], $pass+1);
}
}
$html.= '</ul>' . PHP_EOL;
return $html;
}
于 2012-04-04T12:37:29.693 に答える
3
あなたの問題は、SPL 内ですでに解決されています。RecursiveIteratorIterator
ドキュメントには、アイテムの深さに関する情報があります。
$it = new RecursiveIteratorIterator(new RecursiveArrayIterator($array), SELF_FIRST);
foreach ($it as $key => $element)
{
if ($key !== 'name') continue;
$inset = str_repeat('--', $it->getDepth());
printf('<option>%s %s</option>', $inset, $element);
}
于 2012-04-04T13:03:27.760 に答える
1
こんにちは皆さん、次のようなことができます:私は次のオブジェクトを持っています$tree
:
Array
(
[0] => stdClass Object
(
[id] => 1
[nombre] => Category 1
[subcategorias] => Array
(
[0] => stdClass Object
(
[id] => 4
[nombre] => Category 1.1
)
)
)
[1] => stdClass Object
(
[id] => 2
[nombre] => Category 2
)
[2] => stdClass Object
(
[id] => 3
[nombre] => Category 3
[subcategorias] => Array
(
[0] => stdClass Object
(
[id] => 5
[nombre] => Category 3.1
[subcategorias] => Array
(
[0] => stdClass Object
(
[id] => 6
[nombre] => Category 3.1.1
)
)
)
)
)
)
次に、HTML 選択用の配列を作成する方法を次に示します。
$tree=array();// PUT HERE YOUR TREE ARRAY
$arrayiter = new RecursiveArrayIterator($tree);
$iteriter = new RecursiveIteratorIterator($arrayiter);
$lista=array();
$i=0;
foreach ($iteriter as $key => $value)
{
$id=$iteriter->current();
$iteriter->next();
$nivel=$iteriter->getDepth();
$nombre=str_repeat('-',$nivel-1).$iteriter->current();
$lista[$id]=$nombre;
}
次のようなものが得られます。
Array
(
[1] => Category 1
[4] => --Category 1.1
[2] => Category 2
[3] => Category 3
[5] => --Category 3.1
[6] => ----Category 3.1.1
)
次に、単純な foreach を使用して選択のオプションを作成するだけです。
于 2012-10-17T21:15:41.227 に答える
1
私の最終的な解決策(Starxとvaranに感謝):
function toSelect ($arr, $depth=0) {
$html = '';
foreach ( $arr as $v ) {
$html.= '<option value="' . $v['_id'] . '">';
$html.= str_repeat('--', $depth);
$html.= $v['name'] . '</option>' . PHP_EOL;
if ( array_key_exists('children', $v) ) {
$html.= toSelect($v['children'], $depth+1);
}
}
return $html;
}
echo '<select>';
echo toSelect($array);
echo '</select>';
解決策もRecursiveIteratorIterator
良いです(hakreに感謝します)。
于 2012-04-07T09:28:31.127 に答える
1
function toSelect($arr, $depth = 0) {
$html = '';
foreach ( $arr as $v ) {
$html.= '<option>' . str_repeat("--", $depth) . $v['name'] . '</option>' . PHP_EOL;
if ( array_key_exists('children', $v) ) {
$html.= toSelect($v['children'], $depth++);
}
}
return $html;
}
于 2012-04-04T12:47:52.797 に答える
0
optgroup をイテレータとして使用できます。例えば:
<select name="list">
<option value=1>1st option</option>
<optgroup>
<option value=10>1st on 1st group</option>
</optgroup>
</select>
PHPが必要な場合は、これを試すことができます:
<?PHP
function toSELECT($arr,$depth=0)
{
$html="";
if(is_array($arr))
{
$html.=($depth==0)?"<select name='html'>\n":"";
foreach ($arr as $key=>$value)
{
if(is_array($arr[$key]))
{
$html.=str_repeat("\t",$depth)."<optgroup>\n";
$html.=str_repeat("\t",$depth).toHTML($arr[$key],$depth+1);
$html.=str_repeat("\t",$depth)."</optgroup>\n";
}
else
{
$html.=str_repeat("\t",$depth)."<option value='".$value."'>".$key."</option>\n";
}
}
$html.=($depth==0)?"</select>\n":"";
}
return $html;
}
?>
于 2013-06-30T15:01:54.210 に答える
0
長さを関数に渡し、再帰的に呼び出すときにそれをインクリメントし、変数$length
を使用して深さを決定することができます
function toUL ($arr, $length = 0) {
$html = '<ul>' . PHP_EOL;
foreach ( $arr as $v ) {
$html.= '<li>' . $v['name'] . '</li>' . PHP_EOL;
if ( array_key_exists('children', $v) ) {
$html.= toUL($v['children'], $length++);
}
}
$html.= '</ul>' . PHP_EOL;
return $html;
}
これは、再帰の深さを追跡するために通常行うことであり、通常は仕事を完了させます
于 2012-04-04T12:37:36.340 に答える
0
function toUL ($arr, $depth = 0) {
// ...
$html .= toUL($v['children'], $depth+1);
于 2012-04-04T12:37:42.387 に答える