【问题标题】:How to display multilevel dynamic form field in PHP?如何在 PHP 中显示多级动态表单域?
【发布时间】:2021-05-11 21:19:52
【问题描述】:

我的 HTML 表单,由 PHP 从 MySQL 数据库生成: `

<!-- 1st product -->
<input name="product[]" value="Speaker" />
<!-- 3 components & its values of 1st product -->
<input name="component_name[]" value="Color" />: <input name="value_name[]" value="Black" />
<input name="component_name[]" value="Diameters" />: <input name="value_name[]" value="10" />
<input name="component_name[]" value="Brand" />: <input name="value_name[]" value="Pokijan" />
<!-- 2nd product -->
<input name="product[]" value="Desktop PC" />
<!-- 6 components & its values of 2nd product -->
<input name="component_name[]" value="Brand" />: <input name="value_name[]" value="Tulkiyem" />
<input name="component_name[]" value="OS" />: <input name="value_name[]" value="Linux" />
<input name="component_name[]" value="Processor" />: <input name="value_name[]" value="Intel " />
<input name="component_name[]" value="RAM" />: <input name="value_name[]" value="16 GB" />
<input name="component_name[]" value="HDD" />: <input name="value_name[]" value="-" />
<input name="component_name[]" value="SSD" />: <input name="value_name[]" value="1600 GB" />
<input type="submit" value="Send" />
</form>`

条件:

  1. “Speaker”、“Desktop PC”这些词取自mysql产品类别表
  2. “颜色”、“直径”、“品牌”、“内存”等词取自产品组件表
  3. 我想在每个产品/类别下创建无限的组件及其价值
  4. 我想将表单数据发布到 2 个不同的 MySQL 表中:transaction 和 transaction_components。

问题是,(使用 PHP):

  1. 如何将它全部发布到这样的正确数组中(认为我是对的): $product=array("Speaker"=&gt; ["color"=&gt;"Black", "Diameters"=&gt;"10", "Brand"=&gt;"Pokijan"], "Desktop PC"=&gt;["Brand"=&gt;"Tulkiyem", "OS"=&gt;"Linux", "Processor"="Intel", "RAM"=&gt;"16 GB", "HDD"=&gt; "-", "SSD"=&gt;"1600 GB"]);
  2. 显示数据如下: `
    1. 演讲者:
      • 颜色:黑色
      • 直径:10
      • 品牌:Pokijan
    2. 台式电脑
      • 品牌:Tulkiyem
      • 操作系统:Windows
      • 处理器:英特尔
      • 内存:16 GB
      • 硬盘:-
      • 固态硬盘:1600 GB
    `

这对我不起作用: `

$cid=$_POST['cid'];
$komponen=$_POST['komponen'];
$opsi=$_POST['opsi'];
echo "<ul>";
$jb=count($cid);
for($i=0; $i<$jb;$i++)
{
    if($cid[$i]<>"")
    {
        $jk=count($komponen);
        echo "<li>Product-$i: $cid[$i]
        <ol>";
            for($x=0;$x<$jk; $x++)
            {
               echo "<li>$komponen[$x]: $opsi[$i][$x]</li>";
            }
        echo "</ol></li>";
    }
}
echo "</ul>";
?>`

【问题讨论】:

  • 对你来说什么是“正确的数组”?你期望的输出是什么?
  • 已编辑问题。谢谢
  • ColorBrand 等是输入似乎很奇怪。难道不应该对它们进行硬编码,并且只将它们的值创建为输入吗?
  • 是的,这些变量是动态的,所以值是。

标签: php arrays forms multidimensional-array


【解决方案1】:

与其在提交时尝试大量重新格式化,不如确保在生成表单时尽可能接近所需的数组结构。您无法准确获得所需的内容,但会显式生成名称中的键,如下所示:

<input name="products[0][name]" value="Speaker" />
<!-- 3 components & its values of 1st product -->
<input name="products[0][component_names][0]" value="Color" />: <input name="products[0][component_values][0]" value="Black" />
<input name="products[0][component_names][1]" value="Diameters" />: <input name="products[0][component_values][1]" value="10" />
<input name="products[0][component_names][2]" value="Brand" />: <input name="products[0][component_values][2]" value="Pokijan" />
<!-- 2nd product -->
<input name="products[1][name]" value="Desktop PC" />
<!-- 6 components & its values of 2nd product -->
<input name="products[1][component_names][0]" value="Brand" />: <input name="products[1][component_values][0]" value="Tulkiyem" />
<input name="products[1][component_names][1]" value="OS" />: <input name="products[1][component_values][1]" value="Linux" />
<input name="products[1][component_names][2]" value="Processor" />: <input name="products[1][component_values][2]" value="Intel" />
<input name="products[1][component_names][3]" value="RAM" />: <input name="products[1][component_values][3]" value="16 GB" />
<input name="products[1][component_names][4]" value="HDD" />: <input name="products[1][component_values][4]" value="-" />
<input name="products[1][component_names][5]" value="SSD" />: <input name="products[1][component_values][5]" value="1600 GB" />

会产生一个这样的数组:

array(
    'products' => array(
        0 => array(
            'name' => 'Speaker',
            'component_names' => array(
                0 => 'Color',
                1 => 'Diameters',
                2 => 'Brand',
            ),
            'component_values' => array(
                0 => 'Black',
                1 => '10',
                2 => 'Pokijan',
            ),
        ),
        1 => array(
            'name' => 'Desktop PC',
            'component_names' => array(
                0 => 'Brand',
                1 => 'OS',
                2 => 'Processor',
                3 => 'RAM',
                4 => 'HDD',
                5 => 'SSD',
            ),
            'component_values' => array(
                0 => 'Tulkiyem',
                1 => 'Linux',
                2 => 'Intel',
                3 => '16 GB',
                4 => '-',
                5 => '1600 GB',
            ),
        ),
    ),
)

现在执行输出变得更加容易:

<ol>
<?php foreach ($_POST['products'] as $product): ?>
    <li><?= $product['name'] ?></li>
    <ul>
        <?php foreach ($product['component_names'] as $key => $componentName): ?>
            <li><?= $componentName.': '.$product['component_values'][$key] ?></li>
        <?php endforeach ?>
    </ul>
<?php endforeach ?>
</ol>

由于我们已经明确定义了键,我们知道与组件名称对应的值将在'component_values'下的同一个键中。

另请注意,我使用alternative syntax 输出 HTML,因为这允许 IDE 和高级文本编辑器正确突出显示您的 HTML 元素并为它们提供自动完成值,这与将 HTML 打印为字符串不同。

【讨论】:

  • 感谢您的解决方案,效果更好。
猜你喜欢
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多