PHP 拆分和排序新数组中的数据

PHP Split and sort data in new array

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

问题: 是否可以使用相同的代码库来解决 "data block 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);

结果(正在处理"Data block 1"):

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

                )

        )

)

想要的结果(正在处理 "Data block 1" & "Data block 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
                        )

                )

        )

)

试试这个

<?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'];

?>

您可以遍历 $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 循环来迭代值),您应该按其键对 $frontendData['datasheet'] 进行排序,使用 uksort 回调 strnatcmp 以确保 balance10balance2 之后排序到 balance9:

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

Demo on 3v4l.org