【问题标题】:How to create associative multidimensional array from input form如何从输入表单创建关联多维数组
【发布时间】:2017-10-13 01:41:54
【问题描述】:

我需要从输入表单创建多维数组,因为我想将信息传递给 mysql。我创建了它,但我怎样才能使它具有关联性? 我的意见:

echo "<input type='number' name='hours_to_save[$my_date][$project[$i]]'/>"

现在是这样打印的:

array(30) {
    ["2017-05-01"]=>
        array(3) {
            ["kompan"]    => string(1) "2"
            ["5 ogrodow"] => string(1) "3"
            ["karolowo"]  => string(1) "4"
    },
    ...
}

但我想要这样:

array(30) {
  ["2017-05-01"]=>
        array(3) {
            ["project"] => "kompan" , ["hours"] => string(1) "2"

            ["project"] =>"5 ogrodow" , ["hours"] => string(1) "3"

            ["project"] => "karolowo" , ["hours"] => string(1) "4"
    },
    ...
}

【问题讨论】:

  • 你有一个键指向一个数组作为你想要的输出,没有人可以为你创建这个数组结构,因为这是不可能的:["date"] =&gt; "2017-05-01"=&gt; array()
  • @mickmackusa 当然,你是对的。它可以是这样的:` array(30) { ["2017-05-01"] => array(3) { ["project"] => "kompan" ... `

标签: php html arrays forms multidimensional-array


【解决方案1】:

输入:

$input=array(
    "2017-05-01"=>["kompan"=>"2","5 ogrodow"=>"3","karolowo"=>"4"],
    "2017-05-02"=>["kompan"=>"5","5 ogrodow"=>"6","karolowo"=>"7"]    
);

方法#1(foreach() x2 *推荐)

foreach($input as $d=>$a){
    foreach($a as $k=>$v){
        $result[$d][]=['project'=>$k,'hours'=>$v];
    }
}
var_export($result);

这意味着:

$result                         // declare output array
       [$d]                     // use the date values as keys
           []=                  // autoincrement the keys in the subarray
              ['project'=>$k,   // each subarray's 1st element will use 'project' as the key and the input subarray's key as its value
               'hours'=>$v];    // each subarray's 2nd element will use 'hours' as the key and the input subarray's value as its value

方法#2(foreach() & array_map()-array_keys() *纯用于演示)

foreach($input as $k=>$a){
    $result[$k]=array_map(function($a,$b){return ['project'=>$a,'hours'=>$b];},array_keys($input[$k]),$input[$k]);
}
var_export($result);

输出(不考虑方法):

array (
  '2017-05-01' => 
  array (
    0 => 
    array (
      'project' => 'kompan',
      'hours' => '2',
    ),
    1 => 
    array (
      'project' => '5 ogrodow',
      'hours' => '3',
    ),
    2 => 
    array (
      'project' => 'karolowo',
      'hours' => '4',
    ),
  ),
  '2017-05-02' => 
  array (
    0 => 
    array (
      'project' => 'kompan',
      'hours' => '5',
    ),
    1 => 
    array (
      'project' => '5 ogrodow',
      'hours' => '6',
    ),
    2 => 
    array (
      'project' => 'karolowo',
      'hours' => '7',
    ),
  ),
)

【讨论】:

  • 对不起,仅提供代码答案,我会尽快回来提供完整的解释,并可能检查改进/替代方法。 (没时间了——母亲节等等!)
  • 完美!有用。这对我来说太复杂了,这就是我没有整理出来的原因。如果您能提供任何解释,我将非常感激。
  • @WojciechB。早上醒来我会回来写一个有两个循环的更简单的版本。我会解释一切。
  • @WojciechB。提供了简单的答案和解释。如果您对此有任何疑问或麻烦,请给我评论。
  • 谢谢你,伙计!现在对我来说很清楚了。现在,我相信论坛上有乐于助人的人。
【解决方案2】:

您可以使用 foreach 循环插入到 mysql。 Foreach 将继续到数组的末尾。

$newArr = [];
$i=0;
foreach ($yourArray as $key=>$val) {
   $newArr['date'] = $key;
   foreach ($val as $dKey=>$row) {
      $newArr['date'][$i]['project'] = $dKey;
      $newArr['date'][$i]['hours'] = $row;
      $i++;
   }
}

【讨论】:

  • 感谢您的快速回复,但我有错误:Fatal error: Cannot use string offset as an array in C:\xampp\htdocs\aplikacja\gra.php on line 120我的 120 行是这一行:$newArr['date'][$i]['project'] = $dKey;
猜你喜欢
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 2015-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多