【问题标题】:Group array structure with PHP用 PHP 分组数组结构
【发布时间】:2018-09-01 13:56:33
【问题描述】:

我需要从这个数组中重新排列:

Array
(
[0] => Array
    (
        [0] => Qty
        [1] => 1
        [2] => 3
    )

[1] => Array
    (
        [0] => Item No
        [1] => ABC345
        [2] => FGR8765
    )

[2] => Array
    (
        [0] => Description
        [1] => Lores ipsum
        [2] => Dolores sit amet
        [3] => quasi architecto beatae:
        [4] => sed quia consequuntur
        [5] => consectetur, adipisci velit
    )

[3] => Array
    (
        [0] => Price
        [1] => $10
        [2] => $20
    )

变成这样:

 Array
 (
   [0] => array(
     'Qty' => 1,
     'Item No' => 'ABC345',
     'Description' => 'Lores ipsum',
     'Price' => $10
   )
   [1] => array(
     'Qty' => 3,
     'Item No' => 'FGR8765',
     'Description' => 'Dolores sit amet quasi architecto beatae sed quia consequuntur consectetur, adipisci velit',
     'Price' => $20
   )
)

对于每个数组的 0 索引是键的名称:数量,项目编号,描述,价格。 如果索引大于第一个数组的数量,则合并值,正如我们在描述键上看到的,值数组编号 3,4,5 合并到数组编号 2。

这是我目前的尝试:

$itemList = array();
foreach($result as $i => $valueKey)
{
    if($i == 0) {
      $max = count($valueKey);
    }
    foreach($valueKey as $y => $item)
    {
        $itemList[] = array(
            $item[0] => $item
        );
    }
}

【问题讨论】:

  • 如果两个项目将包含第一个描述,数组将如何更改?
  • 你有控制这个数组的来源吗?感觉修复解析步骤可能比尝试从这个结构重建它更容易。
  • 这是一个非常不清楚的问题。如果有三个项目会发生什么?你怎么知道在哪里拆分描述?在这种状态下,这个问题的所有答案都只是纯粹的猜测,只是一个文字代码来做你想做的事。他们都没有处理三个或更多项目的逻辑。或者第一个项目有两个描述项目。

标签: php arrays grouping


【解决方案1】:
$input = array(/* input array */);
$output = array(/* output array */);

foreach ($input as $property)
{
    $propcount = count($property);
    for ($i = 1; $i < $propcount; $i++)
        $output[$i - 1][$property[0]] = $property[$i];
}

【讨论】:

    【解决方案2】:

    你可以这样做:

    $input = [
        [ "Qty", 1, 3 ],
        [ "Item No", "ABC345", "FGR8765" ],
        [ "Description", "Lores ipsum", "Dolores sit amet", "quasi architecto beatae:", "sed quia consequuntur", "consectetur, adipisci velit" ],
        [ "Price", "$10", "$20" ]
    ];
    
    $max = count($input[0]) - 1;
    $output = array_reduce(
        $input,
        function (array $out, array $items) use ($max) {
            $header = array_shift($items);
            $redundant = array_splice($items, $max);
    
            foreach ($items as $idx => $value) {
                $out[$idx][$header] = $value;
            }
    
            foreach ($redundant as $value) {
                $out[$idx][$header] .= ' ' . $value;
            }
    
            return $out;
        },
        []
    );
    
    var_dump($output);
    

    我还建议把它放在一个名字好听的函数中。

    【讨论】:

      【解决方案3】:

      您好,我希望这会对您有所帮助:)

      $result = Array
      (
          Array
          (
              "Qty", 1, 3
          ),
          Array
          (
              "Item No", "ABC345", "FGR8765"
          ),
          Array
          (
              "Description", "Lores ipsum", "Dolores sit amet", "quasi architecto beatae:", "sed quia consequuntur", "consectetur, adipisci velit"
          ),
          Array
          (
              "Price", "$10", "$20"
          )
      );
      
      $total_result = count($result);
      $itemList = $final_result = array();
      $i = 1;
      foreach ($result as $res) {
          foreach ($result as $item) {
              if (isset($item[0])) {
                  foreach ($item as $key => $val) {
                                $itemList[$item[0]] = ($item[$i]=="")?0:$item[$i];
                  }
              }
          }
          $i++;
          $final_result[] = $itemList;
      }
      echo '<pre>';
      print_r($final_result);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多