Php 使用不同的键和值对多维数组排序
我有一个表单,用户可以在其中添加他们需要的所有附加字段 注意:我想找到一种更有效地组织代码的方法,稍后我会详细解释 由于它是用HTML构建的,因此我对其进行了简化,使其更易于理解:Php 使用不同的键和值对多维数组排序,php,html,arrays,sorting,Php,Html,Arrays,Sorting,我有一个表单,用户可以在其中添加他们需要的所有附加字段 注意:我想找到一种更有效地组织代码的方法,稍后我会详细解释 由于它是用HTML构建的,因此我对其进行了简化,使其更易于理解: <form action="" method="post"> <h1>Products</h1> <p> <input type="text" name="product_name[]" value="Product
<form action="" method="post">
<h1>Products</h1>
<p>
<input type="text" name="product_name[]" value="Product #1">
<input type="text" name="product_sku[]" value="pro-001">
<input type="text" name="product_price[]" value="$12.00">
<input type="text" name="product_stock[]" value="10">
</p>
<p>
<input type="text" name="product_name[]" value="Product #2">
<input type="text" name="product_sku[]" value="pro-002">
<input type="text" name="product_price[]" value="$12.00">
<input type="text" name="product_stock[]" value="10">
</p>
<p><button type="submit">Add Product</button></p>
</form>
我希望我能收到这样的代码:
Array
(
[0] => Array
(
[product_name] => Product #1
[product_sku] => pro-001
[product_price] => $12.00
[product_stock] => 10
)
[1] => Array
(
[product_name] => Product #2
[product_sku] => pro-002
[product_price] => $12.00
[product_stock] => 10
)
)
我通过以下方式实现了它,但我想以一种更为优化的方式实现它
if(isset($_POST) && !empty($_POST)) {
// Total products to add
$total_products = count($_POST["product_name"]);
// Products ordered
$products_created = [];
for ($i=0; $i <$total_products ; $i++) {
$products_created[$i] = array(
'product_name' => $_POST["product_name"][$i],
'product_sku' => $_POST["product_sku"][$i],
'product_price' => $_POST["product_price"][$i],
'product_stock' => $_POST["product_stock"][$i]
);
}
echo "<pre>"; print_r($_POST);
echo "<pre>"; print_r($products_created);
}
if(isset($\u POST)和&!empty($\u POST)){
//要添加的产品总数
$total_products=计数($_POST[“product_name”]);
//订购的产品
$products_created=[];
对于($i=0;$i$\u POST[“产品名称”][$i],
“产品库存单位”=>$\u POST[“产品库存单位”][$i],
“产品价格”=>$发布[“产品价格”][$i],
“产品库存”=>$\u POST[“产品库存”][$i]
);
}
回声“;打印(邮政美元);
回声“;打印(创建的产品);
}
完整的示例代码:
产品
添加产品
PHP中的解决方案
您可以使用转置
功能,将$\u POST
数据转换为所需的数据结构:
函数转置($array){
foreach($key=>$value的数组){
foreach($i=>$value的值)$result[$i][$key]=$value;
}
返回$result;
}
称为:
HTML中的解决方案
如果将HTML更改为以下格式,则可以在PHP$\u POST
中直接获得所需的结构:
产品
添加产品
您需要一些逻辑来将序列号插入name
属性的第一个括号对中。假设这个HTML是由PHP生成的,那么这样做并不困难。如果您的HTML在客户端是动态的,在客户端可以在不与服务器交互的情况下添加行,那么您还需要使用JavaScript来完成这项工作
我想您在设置时不会有问题。您有权更改HTML吗?如果我有权更改HTML,但添加字段的用户无法更改。不确定是否有效,但您可以尝试以下操作:
name=“product[].name”
和name=“product[].sku”
等。通常我添加javascript来动态构建后端数组,而不是依赖自动数组功能。这是一个非常好的主意非常好的解决方案,如果我能用javascript做到这一点,我会,非常感谢你的想法,上帝保佑你
if(isset($_POST) && !empty($_POST)) {
// Total products to add
$total_products = count($_POST["product_name"]);
// Products ordered
$products_created = [];
for ($i=0; $i <$total_products ; $i++) {
$products_created[$i] = array(
'product_name' => $_POST["product_name"][$i],
'product_sku' => $_POST["product_sku"][$i],
'product_price' => $_POST["product_price"][$i],
'product_stock' => $_POST["product_stock"][$i]
);
}
echo "<pre>"; print_r($_POST);
echo "<pre>"; print_r($products_created);
}
<?php
if(isset($_POST) && !empty($_POST)) {
// Total products to add
$total_products = count($_POST["product_name"]);
// Products ordered
$products_created = [];
for ($i=0; $i <$total_products ; $i++) {
$products_created[$i] = array(
'product_name' => $_POST["product_name"][$i],
'product_sku' => $_POST["product_sku"][$i],
'product_price' => $_POST["product_price"][$i],
'product_stock' => $_POST["product_stock"][$i]
);
}
echo "<pre>"; print_r($_POST);
echo "<pre>"; print_r($products_created);
}
?>
<form action="" method="post">
<h1>Products</h1>
<p>
<input type="text" name="product_name[]" value="Product #1">
<input type="text" name="product_sku[]" value="pro-001">
<input type="text" name="product_price[]" value="$12.00">
<input type="text" name="product_stock[]" value="10">
</p>
<p>
<input type="text" name="product_name[]" value="Product #2">
<input type="text" name="product_sku[]" value="pro-002">
<input type="text" name="product_price[]" value="$12.00">
<input type="text" name="product_stock[]" value="10">
</p>
<p><button type="submit">Add Product</button></p>
</form>
$products_created = transpose($_POST);