【问题标题】:PHP Split and sort data in new arrayPHP拆分和排序新数组中的数据
【发布时间】:2020-06-01 09:36:11
【问题描述】:

重构 PHP 数组数据。 测试“数据块 1”工作正常,数据在 $newArray_1 中正确分解,最后在 $newArray_2 中排序。我并没有真正使用explode,而是选择将其保留在代码中,因为稍后将使用它来提取新数组中所需的键名。

问题:是否可以使用相同的代码库来解决“数据块 2”的相同处理?


我的代码:

// Unsorted array -------------------------------------

$frontendData = [
  'datasheet' => [
    'Name_1_balance0'    => 1, // Data block 1
    'Name_1_balance2'    => 3, // Data block 1
    'Name_1_balance3'    => 4, // Data block 1
    'Name_1_balance1'    => 2, // Data block 1
    // 'Name_2_balance0'    => 5, // Data block 2
    // 'Name_2_balance2'    => 7, // Data block 2
    // 'Name_2_balance3'    => 8, // Data block 2
    // 'Name_2_balance1'    => 6, // Data block 2
  ]
];

ksort($frontendData['datasheet']);
print_r($frontendData);

// Explode array -------------------------------------

$newArray_1 = [];

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

print_r($newArray_1);

// Restructure array -------------------------------------

$newArray_2['datasheet'] = ['Name_1'];


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

  $newArray_2['datasheet'][1]['balance'][$i] =
    $newArray_1['datasheet'][$i][3];

}

print_r($newArray_2);

结果(处理“数据块 1”):

Array
(
    [datasheet] => Array
        (
            [0] => Name_1
            [1] => Array
                (
                    [balance] => Array
                        (
                            [0] => 1
                            [1] => 2
                            [2] => 3
                            [3] => 4
                        )

                )

        )

)

想要的结果(处理“数据块 1”和“数据块 2”):

Array
(
    [datasheet] => 
        Array
        (
            [0] => Name_1
            [1] => Array
                (
                    [balance] => Array
                        (
                            [0] => 1
                            [1] => 2
                            [2] => 3
                            [3] => 4
                        )

                )

        ),
        Array
        (
            [0] => Name_2
            [1] => Array
                (
                    [balance] => Array
                        (
                            [0] => 5
                            [1] => 6
                            [2] => 7
                            [3] => 8
                        )

                )

        )

)

【问题讨论】:

  • 为什么balance的额外级别的数组?
  • @Nick 在某些情况下,我需要对数据进行循环迭代,然后使用索引而不是键名更容易获得键。
  • 这些答案之一是否解决了您的问题?如果没有,您能否提供更多信息来帮助回答?
  • 很高兴听到。如果您担心我的答案提供的数据顺序,您可以在循环之前始终ksort($frontendData['datasheet']);

标签: php arrays sorting multidimensional-array php-7.3


【解决方案1】:

您可以遍历您的$frontendData 数组,使用preg_match 提取名称和余额编号(从而避免对数组进行排序),并使用这些名称索引的值构建一个结果数组。然后我们使用array_values 以数字方式重新索引数组并将其分配给输出中的datasheet 键:

$result = array();

foreach ($frontendData['datasheet'] as $key => $balance) {
    preg_match('/^(\w+)_balance(\d+)$/', $key, $match);
    $result[$match[1]][0] = $match[1];
    $result[$match[1]][1]['balance'][$match[2]] = $balance;
}
$result = array('datasheet' => array_values($result));
print_r($result);

输出(用于您的样本数据):

Array
(
    [datasheet] => Array
        (
            [0] => Array
                (
                    [0] => Name_1
                    [1] => Array
                        (
                            [balance] => Array
                                (
                                    [0] => 1
                                    [2] => 3
                                    [3] => 4
                                    [1] => 2
                                )
                        )
                )
            [1] => Array
                (
                    [0] => Name_2
                    [1] => Array
                        (
                            [balance] => Array
                                (
                                    [0] => 5
                                    [2] => 7
                                    [3] => 8
                                    [1] => 6
                                )
                        )
                )
        )
)

Demo on 3v4l.org

请注意,balance 数组中的条目的出现顺序与它们在原始 datasheet 数组中的顺序相同,因此索引可能不是按数字顺序排列的。如果这是一个问题(例如,如果您想使用 foreach 而不是在索引上循环使用 for 来迭代值),您应该使用 uksort 按其键对 $frontendData['datasheet'] 进行排序,并使用回调strnatcmp 以确保 balance10balance2balance9 之后排序:

uksort($frontendData['datasheet'], 'strnatcmp');

Demo on 3v4l.org

【讨论】:

  • 不错,超级干净。请将 ksort 建议添加到此答案中。请注意,如果在将字符串拆分为值之前完成,则 ksort 会对两位编号的键进行错误排序。
【解决方案2】:

试试这个

<?php
// Unsorted array -------------------------------------

$frontendData = [
  'datasheet' => [
    'Name_2_balance0'    => 5, // Data block 2
    'Name_1_balance0'    => 1, // Data block 1
    'Name_1_balance2'    => 3, // Data block 1
    'Name_1_balance3'    => 4, // Data block 1
    'Name_1_balance1'    => 2, // Data block 1
    'Name_2_balance2'    => 7, // Data block 2
    'Name_2_balance3'    => 8, // Data block 2
    'Name_2_balance1'    => 6, // Data block 2
  ]
];

ksort($frontendData['datasheet']);
// print_r($frontendData);

// Explode array -------------------------------------

$newArray_1 = array('datasheet'=>array());
$key='';
$i = 0;
foreach ( $frontendData['datasheet'] as $mainKey => $elements )  {
    $newData = explode("_", $mainKey);
    if(sizeof($newData)>=3){
        $newkey=$newData[0].'_'.$newData[1];
        if($newkey!=$key){
            $key=$newkey;
            array_push($newArray_1['datasheet'],array());
            array_push($newArray_1['datasheet'][$i], $newkey);
            array_push($newArray_1['datasheet'][$i], array());
            $k=array();
            array_push($k, $elements);
            $newArray_1['datasheet'][$i][1]=array('balance' => $k);
            $i++;

        }else{
            array_push($newArray_1['datasheet'][$i-1][1]['balance'], $elements);
        }

    }

}
echo "<pre>";
print_r($newArray_1);
echo "</pre>";
// Restructure array -------------------------------------

//$newArray_2['datasheet'] = ['Name_1'];

?>

【讨论】:

    猜你喜欢
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    相关资源
    最近更新 更多