PHP - 基于键中的字符分离数组

时间:2014-09-23 11:31:14

标签: php arrays forms

我有一个提交表单中的PHP数组,如下所示

$form_data = Array (
    [input_1_1] => Product Name
    [input_1_2] => $8.00
    [input_1_3] => 2
    [input_2_1] => Other Product Name
    [input_2_2] => $3.50
    [input_2_3] => 8
)

我正在寻找解析此问题的最佳方法,因此我可以构建这样的标记:

<table>
    <tr>
        <td>Product Name</td>
        <td>$8.00</td>
        <td>2</td>
    </tr>
    <tr>
        <td>Other Product Name</td>
        <td>$3.50</td>
        <td>8</td>
    </tr>
</table>

最常用的犹太方法是什么?

我应该根据第一个数字将这个数组拆分成更小的数组(然后循环它们)吗? 或者我应该根据三个集合构建标记,例如:

<table>
    <tr>
        <td><?php echo $form_data[1]; ?></td>
        <td><?php echo $form_data[2]; ?></td>
        <td><?php echo $form_data[3]; ?></td>
    </tr>
    <tr>
        <td><?php echo $form_data[4]; ?></td>
        <td><?php echo $form_data[5]; ?></td>
        <td><?php echo $form_data[6]; ?></td>
    </tr>
</table>

任何帮助/建议表示赞赏。

6 个答案:

答案 0 :(得分:1)

看一下这个例子:http://codepad.org/zhKbc4p1

$arr = array('input_1_1'=>'Name', 'input_1_2'=>'$8', 'input_1_3'=>1, 'input_2_1'=>'Name', 'input_2_2'=>'$28', 'input_2_3'=>1);
$chunk = array_chunk($arr, 3);

print_r($chunk);
foreach( $chunk as $val ){
    foreach($val as $v){
        echo $v . "\r\n";
     }
    echo "\r\n\r\n";
}

预期的HTML格式:

foreach( $chunk as $val ){
    echo "<tr>";
    foreach($val as $v){
        echo "<td>" . $v . "</td>";
     }
    echo "</tr>";
}

答案 1 :(得分:0)

$last_group = '';
foreach ($form_data as $key => $value) {
    preg_match('/input_(\d+)/', $key, $match);
    if ($match[1] != $last_group) {
        if ($last_group) {
            echo "</tr>\n";
        }
        echo "<tr>\n";
        $last_group = $match[1];
    }
    echo "<td>$value</td>\n";
}
if ($last_group) {
    echo "</tr>\n";
}

最好像这样构建你的表单:

<input type="text" name="name[]">
<input type="text" name="price[]">
<input type="text" name="quantity[]">

然后$_POST['name']$_POST['price']$_POST['quantity']将成为数组,您可以迭代它们:

foreach ($_POST['name'] AS $i => $name) {
    $price = $_POST['price'][$i];
    $quantity = $_POST['quantity'][$i];
    // Output the table row
}

答案 2 :(得分:0)

试试这个     

$form_data = Array (
'[input_1_1]' => 'Product Name',
'[input_1_2]' => '$8.00',
'[input_1_3]' => '2',
'[input_2_1]' => 'Other Product Name',
'[input_2_2]' => '$3.50',
'[input_2_3]' => '8'
);

echo "&lt;table&gt;";
foreach($form_data as $k=>$v)
{
echo "&lt;tr&gt;";
echo "&lt;td&gt;".$v."&lt/td&gt;";
echo "&lt;/tr&gt;";
}
echo "&lt;/table&gt;";

答案 3 :(得分:0)

假设 每个表格行各有3个元素;

<?php

echo "<table>
        <tr>";

$form_data = Array (
    "input_1_1" => "Product Name",
    "input_1_2" => "$8.00",
    "input_1_3" => "2",
    "input_2_1" => "Other Product Name",
    "input_2_2" => "$3.50",
    "input_2_3" => "8"
);

$intRowBefore = 1;
foreach( $form_data as $strKey => $strVal ) {

   $intRow = explode("_", $strKey)[1];

   if( $intRowBefore != $intRow ) {
      echo "</tr><tr>";
      $intRowBefore = $intRow;
   }

   echo "<td>". $strVal ."</td>";


}

echo "</tr></table>";

答案 4 :(得分:0)

考虑

<?php
$form_data = array();
$form_data['input_1_1'] = 'Product Name';
$form_data['input_1_2'] = '$8.00';
$form_data['input_1_3'] = '2';
$form_data['input_2_1'] = 'Other Product Name';
$form_data['input_2_2'] = '$3.50';
$form_data['input_2_3'] = '8';

// Get unique keys
function get_unique_keys($keys)
{
    $arr = array();
    foreach($keys as $k=>$v){
        $arr[] = substr($k, 0, strlen($k)-2);
    }
    return array_unique($arr);
}

$keys = get_unique_keys($form_data);

// Output
printf("<table>\n");
foreach($keys as $k)
{
    printf("  <tr>\n");
    printf("    <td>%s</td>\n", $form_data[$k.'_1']);
    printf("    <td>%s</td>\n", $form_data[$k.'_2']);
    printf("    <td>%s</td>\n", $form_data[$k.'_2']);
    printf("  </td>\n");
}
printf("</table>\n");

哪个输出:

<table>
  <tr>
    <td>Product Name</td>
    <td>$8.00</td>
    <td>$8.00</td>
  </td>
  <tr>
    <td>Other Product Name</td>
    <td>$3.50</td>
    <td>$3.50</td>
  </td>
</table>

查看实际操作:http://ideone.com/355STr


它并不复杂。它得到了关键&#34; root&#34;我们会调用它们(input_1input_2等)并循环播放这些内容,并在需要时附加额外的_1_2_3

长期更好的解决方案是重新设计表单,但这并非总是可行。

答案 5 :(得分:0)

<?php
$form_data = array(
    'input_1_1' => 'Product Name',
    'input_1_2' => 8.00,
    'input_1_3' => 2,
    'input_2_1' => 'Other Product Name',
    'input_2_2' => 3.50,
    'input_2_3' => 8
);
end($form_data);
$counter = explode('_',key($form_data));
?>

<table>
    <?php
    $i = 1;
    $j = 1;
    for ($k = 1; $k <= $counter[1]; $k++) {
        ?>
        <tr>
            <td><?php echo $form_data['input_' . $j . '_' . $i]; ?></td>
            <td><?php $i++;echo $form_data['input_' . $j . '_' . $i]; ?></td>
            <td><?php $i++;echo $form_data['input_' . $j . '_' . $i]; ?></td>
        </tr>
        <?php
        if ($i == 3) {
            $i = 1;
            $j++;
        }
    }
    ?>
</table>