【问题标题】:php creating a multidimension array from 2 separate arraysphp从2个单独的数组创建一个多维数组
【发布时间】:2022-07-30 11:52:45
【问题描述】:

我有以下工作代码,它从 2 个单独的数组 ($I & $f) 创建最终的多维数组,并将数据作为关联列。

问题是我觉得代码很笨拙,但我看不出它是否或如何改进。所以我希望第二双眼睛能提供帮助。

<?php
//main array of input data
$i = [  'input_tickettype1_storeno_00' => null,
        'input_tickettype1_deliverydate_00' => null,
        'input_tickettype1_ticketref_00' => null,
        'input_tickettype1_storeno_01' => '9874',
        'input_tickettype1_deliverydate_01' => '2022-02-01',
        'input_tickettype1_ticketref_01' => 'EDN6547',
        'input_tickettype1_storeno_02' => '8547',
        'input_tickettype1_deliverydate_02' => '2022-01-31',
        'input_tickettype1_ticketref_02' => 'EDN5473',
        'input_tickettype1_storeno_03' => '9214',
        'input_tickettype1_deliverydate_03' => '2022-02-28',
        'input_tickettype1_ticketref_03' => 'EDN1073'
    ];  
//headers
$h = [  'input_tickettype1_storeno' ,
        'input_tickettype1_deliverydate',
        'input_tickettype1_ticketref'
    ];
//final multidim array
$f = array();

//Create a multidim for the headers and the values
foreach ($h as $k => $v)
{
    $f[] = [$v=>null];
}

//loop throught the headers looping for matches in the input data
for ($x = 0; $x < count($f); $x++) {
    foreach ($f[$x] as $fk => $fv) {
        foreach ($i as $ik => $iv) {
            if  (str_contains($ik,$fk)) {
                array_push($f[$x],$iv);
            } 
        }
    }
}
print_r($f);

//Actual Working Output
// Array ( 
//  [0] => Array ( [input_tickettype1_storeno] => 
//                  [0] => 
//                  [1] => 9874 
//                  [2] => 8547 
//                  [3] => 9214 
//              ) 
//  [1] => Array ( [input_tickettype1_deliverydate] => 
//                  [0] => 
//                  [1] => 2022-02-01 
//                  [2] => 2022-01-31 
//                  [3] => 2022-02-28 
//              ) 
//  [2] => Array ( [input_tickettype1_ticketref] => 
//                  [0] => 
//                  [1] => EDN6547 
//                  [2] => EDN5473 
//                  [3] => EDN1073 
//              )
//  )
?>

【问题讨论】:

    标签: php arrays multidimensional-array


    【解决方案1】:

    是的,我确实认为代码可以针对可读性和逻辑进行优化。

    我能想到两种你可以使用的方法。

    方法一:嵌套foreach

    首先,您不需要foreach 来初始化您的多维数组,您可以在用于读取数据的主loop 中进行。所以你可以删除foreach -- $f[] = [$v=&gt;null];

    然后,不用 1 个 for 和 2 个 foreach,您可以只为每个数组设置 2 个 foreach,并使用非常快的 strpos 来识别键是否匹配并填充最终数组。

    这是生成的代码。

    $f = [];
    foreach ($h as $prefix) {
        $f[$prefix] = [];
        foreach ($i as $key => $val) {
            if (strpos($key, $prefix) === 0) {
                $f[$prefix][] = $val;
            }
        }
    }
    

    第一种方法很简单,逻辑直截了当。但是它需要一个嵌套的foreach。这意味着如果两个数组都变大,您的代码会变慢。

    方法二:按键操作

    此方法假定第一个数组的键永远不会改变结构并且它们始终是somestringid_[digits]

    在这种情况下,我们可以避免循环第二个数组,而只需使用正则表达式来重新创建键。

    $f = [];
    foreach ($i as $key => $value) {
        preg_match('/^(.*)_[0-9]+$/', $key, $m);
        $key = $m[1];
        if (empty($f[$m[1]])) {
            $f[$m[1]] = [];
        }
        $f[$m[1]][] = $value;
    }
    

    【讨论】:

      【解决方案2】:

      我认为没有必要实施任何额外的数据或条件。您只需要读取您的主数组,在迭代时改变键(修剪尾随的唯一标识符),并将数据推送到它们的相关组中。

      代码:(Demo)

      $result = [];
      foreach ($array as $k => $v) {
          $result[preg_replace('/_\d+$/', '', $k)][] = $v;
      }
      var_export($result);
      

      输出:

      array (
        'input_tickettype1_storeno' => 
        array (
          0 => NULL,
          1 => '9874',
          2 => '8547',
          3 => '9214',
        ),
        'input_tickettype1_deliverydate' => 
        array (
          0 => NULL,
          1 => '2022-02-01',
          2 => '2022-01-31',
          3 => '2022-02-28',
        ),
        'input_tickettype1_ticketref' => 
        array (
          0 => NULL,
          1 => 'EDN6547',
          2 => 'EDN5473',
          3 => 'EDN1073',
        ),
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-25
        • 1970-01-01
        • 2021-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-16
        相关资源
        最近更新 更多