【问题标题】:How do I add extra space or dashed symbol to select option?如何添加额外的空格或虚线符号来选择选项?
【发布时间】:2012-12-19 10:48:13
【问题描述】:

我想为我的类别制作一个选择树。这是无序列表。

function generate_menu($parent, $menu_array = null)
{
    $has_childs = false;
    foreach ($menu_array as $key => $value) {
        if ($value['parent'] == $parent) {
            if ($has_childs === false) {
                $has_childs = true;
                echo "<ul>\n";
            }
            echo '<li><a href="#">'.$value['name'].'</a>';
            generate_menu($key, $menu_array);
            echo "</li>\n";
        }
    }
    if ($has_childs === true)
        echo "</ul>\n";
}

这是无序列表的 HTML 输出。

<ul>
  <li>
    Ford
    <ul>
      <li>
        Falcon
        <ul>
          <li>
            Futura
            <ul>
              <li>FPV</li>
              <li>GT</li>
              <li>F6</li>
              <li>GS</li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>
  </li>
  <li>F150</li>
  <li>Festiva</li>
</ul>

问题:如何为select option制作当前函数,结果会是这样。

<select name="categories">
    <option value="Ford">Ford</option>
    <option value="Falcon">-Falcon</option>
    <option value="Futura">--Futura</option>
    <option value="FPV">--FPV</option>
    <option value="GT">---GT</option>
    <option value="F6">---F6</option>
    <option value="GS">---GS</option>
    <option value="F150">-F150</option>
    <option value="Festiva">-Festiva</option>
</select>

【问题讨论】:

  • ul 替换为select,将li 替换为option
  • 请将 ul/li 列表的 HTML 输出也添加到您的问题中。通常很容易将其转换为要用于选择的字符串。
  • @Ibu 是的,如果在无序列表中,它有&lt;ul&gt;&lt;li&gt; 来分隔孩子。在选择选项上,我想添加- Sub--Sub---Sub
  • 如果您想像使用ul 一样生成option,您需要为$level 提供另一个参数。每次进入函数时,您将 $level 增加一,每次外出时,您减少一(在您的情况下,这是函数的开始和结束)。 $level 的默认值为 0。

标签: php hierarchical


【解决方案1】:

我会使用您已经拥有的文本列表,将其转换为 &lt;select&gt; 元素很容易:

$list = <<<LIST
Ford
| Falcon
| | Futura
| | FPV
| | | GT
| | | F6
| | | GS
| F150
| Festiva
LIST;

echo '<select name="categories">', "\n";
foreach (explode("\n", $list) as $entry) {
    $label = strtr($entry, ['| ' => '-']);
    $value = trim($entry, ' |');
    printf("  <option value=\"%s\">%s</option>\n", htmlspecialchars($value), htmlspecialchars($label));
};
echo "</select>\n";

输出:

<select name="categories">
  <option value="Ford">Ford</option>
  <option value="Falcon">-Falcon</option>
  <option value="Futura">--Futura</option>
  <option value="FPV">--FPV</option>
  <option value="GT">---GT</option>
  <option value="F6">---F6</option>
  <option value="GS">---GS</option>
  <option value="F150">-F150</option>
  <option value="Festiva">-Festiva</option>
</select>

否则,如果您无法生成此文本列表而只能生成 ul/li 列表,则以相同的方式处理该 HTML。

更新并提供 HTML 后,ul/li 列表字符串 ($ul) (PHP 5.4) 的工作原理如下:

echo '<select name="categories">', "\n";
foreach ((new SimpleXMLelement($ul))->xpath('//li') as $li) {
    $label = htmlspecialchars(trim($li->xpath('text()[1]')[0]));
    $level = count($li->xpath('ancestor::li'));
    printf(
        "  <option value=\"%s\">%s%s</option>\n",
        $label, str_repeat('-', $level), $label
    );
}
echo "</select>\n";

我之前的回答中更详细地概述了它的工作原理:How can I extract structured text from an HTML list in PHP?。那个是DomDocument 而不是SimpleXMLElement 就像这里一样,但是,或多或少的主要部分是两者都提供的xpath。

这一切都很好。但是,您一定有些错过了实际提供示例数组 - 我刚刚假设:

array (
  1 => 
  array (
    'parent' => 0,
    'name' => 'Ford',
  ),
  2 => 
  array (
    'parent' => 1,
    'name' => 'Falcon',
  ),
  3 => 
  array (
    'parent' => 2,
    'name' => 'Futura',
  ),
  4 => 
  array (
    'parent' => 3,
    'name' => 'FPV',
  ),
  5 => 
  array (
    'parent' => 3,
    'name' => 'GT',
  ),
  6 => 
  array (
    'parent' => 3,
    'name' => 'F6',
  ),
  7 => 
  array (
    'parent' => 3,
    'name' => 'GS',
  ),
  8 => 
  array (
    'parent' => 0,
    'name' => 'F150',
  ),
  9 => 
  array (
    'parent' => 0,
    'name' => 'Festiva',
  ),
)

为您指出一些与您已经为 ul/li 列表所做的一致的方法,这是一个适用于您的数组的递归函数:

function generate_dropdown($menu_array, $parent = 0, $level = -1) {
    ++$level || print('<select name="categories">'. "\n");
    foreach ($menu_array as $key => $value) {
        if ($value['parent'] != $parent) continue;
        $label = htmlspecialchars($value['name']);
        printf("  <option value=\"%s\">%s%s</option>\n", $label, str_repeat('-', $level), $label);
        generate_dropdown($menu_array, $key, $level);
    }
    $level-- || print('</select>');
}

generate_dropdown($array);

输出:

<select name="categories">
  <option value="Ford">Ford</option>
  <option value="Falcon">-Falcon</option>
  <option value="Futura">--Futura</option>
  <option value="FPV">---FPV</option>
  <option value="GT">---GT</option>
  <option value="F6">---F6</option>
  <option value="GS">---GS</option>
  <option value="F150">F150</option>
  <option value="Festiva">Festiva</option>
</select>

【讨论】:

  • 太棒了!非常感谢@hakre。你让我今天一整天都感觉很好。 Paypal 按钮应该在您的个人资料中:)
  • 可以给孩子添加父名&lt;option value="Falcon"&gt;Ford-&gt;Falcon&lt;/option&gt;, &lt;option value="FPV"&gt;Falcon-&gt;Falcon-&gt;FPV&lt;/option&gt;
  • 是的,这是可能的。输出中的this answer shows that for the CHILDREN column(通过将xpath 轴从./ul/li 更改为./ancestor::li 将其转换为父列表),也可以在此处查看xpath 轴:dret.net/lectures/xml/xpath#xpath-axes
  • 如果你的数组列表是排序的,也可以通过将$level 设为父元素数组来获取父元素。它的计数提供了级别,并且数组将为您提供父母的东西,例如他们的标签。让我把它煮熟吧,我想我的盘子里还有代码。
  • 是的,就是这样。分心了,需要看看我是否以及何时添加它。这基本上就像我概述的那样。
猜你喜欢
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
  • 2017-04-23
  • 1970-01-01
相关资源
最近更新 更多