【问题标题】:Explode data and build new array [duplicate]分解数据并构建新数组[重复]
【发布时间】:2020-05-28 06:54:01
【问题描述】:

我需要分解数组的键值并构建一个具有分解结果的新数组。下面的代码适用于一个子数组,我想我缺少一个 for 循环来处理数组值的迭代。

该解决方案还应处理“财务”子数组数据,以便在新数组中展开并显示。

我在后期会有 9 个子数组,因此需要分解数据并将结果移动到新数组中。

我的代码

<?php

$array = [
  'company_info' => [
    'country_period_0'  => 10,
    'currency_period_0' => 20
  ],
  'finance'      => [
    'values_period_0' => 30
  ]
];

$newArray = [];

for ($i=0; $i <= 1 ; $i++) {

  $array_1     = $array['company_info'];
  $arrayKeys   = array_keys($array_1);
  $arrayValues = array_values($array_1);

  $keySplits   = explode("_", $arrayKeys[$i]);

  for ($i=0; $i <= 2 ; $i++) {
    $newArray[] = $keySplits[$i];
  }
    $newArray[3] = $arrayValues[0];

}

print_r($newArray);

结果

Array(
    [0] => country
    [1] => period
    [2] => 0
    [3] => 10
)

想要的结果

['company_info]
Array(
    [0] => country
    [1] => period
    [2] => 0
    [3] => 10
)
Array(
    [0] => currency
    [1] => period
    [2] => 0
    [3] => 20
)
['finance']
Array(
    [0] => values
    [1] => period
    [2] => 0
    [3] => 30
)

【问题讨论】:

  • 您在外部和内部for 循环中保留了与迭代器相同的变量$i。在内部循环中,它在达到外部循环的最大值 ($i &lt;= 1) 处增加$i。这不会修复您的整个代码,但这是一个好的开始

标签: php arrays multidimensional-array php-7.3


【解决方案1】:

您可以使用foreach 循环大大简化它,尤其是每次都获取键和值以帮助构建数组。

这也使用explode()并将结果添加到$newArray,使用$newArray[$mainKey][]将第一级的键添加到数组的末尾,但也只是使用[]将值添加到数组的末尾...

foreach ( $array as $mainKey => $elements )  {
    foreach ( $elements as $subKey => $value ){
        $newData = explode("_", $subKey);
        $newData[] = $value;
        $newArray[$mainKey][] = $newData;
    }
}

用你的测试数据给出...

Array
(
    [company_info] => Array
        (
            [0] => Array
                (
                    [0] => country
                    [1] => period
                    [2] => 0
                    [3] => 10
                )

            [1] => Array
                (
                    [0] => currency
                    [1] => period
                    [2] => 0
                    [3] => 20
                )

        )

    [finance] => Array
        (
            [0] => Array
                (
                    [0] => values
                    [1] => period
                    [2] => 0
                    [3] => 30
                )

        )

)

我刚刚注意到我丢失了第二个 company_info 数据,因此这意味着这些值将始终是数组,除非您真的只需要在需要时才将它们作为数组。

【讨论】:

  • 结果保持为数组完全没问题,因为我计划在后期迭代数据。
【解决方案2】:
$new_array=[];
foreach($array as $category => $tmp ){

  foreach($tmp as $key => $value){
    $exp = explode('_', $key);
    $exp[] = $value;
    $new_array[ $category ][] = $exp;
    }

}

【讨论】:

  • 不欢迎发布没有任何解释的代码,而且根本没有帮助。 “给一个人一个程序,他有一天会受苦。教他如何编程,他每天都会受苦”
  • @Michel 您的建议效果很好。请用一些解释更新答案,我会继续批准答案。为了让更多人理解您的答案和逻辑,我认为您也可以稍微扩展使用的名称约定,例如$exp
  • 支持仅代码答案会发送错误消息。
  • 抱歉,各位,输入了代码,必须赶时间。今天会更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2016-07-10
  • 2018-11-27
  • 2018-11-02
  • 2018-07-07
相关资源
最近更新 更多