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

问题描述 投票:0回答:2

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

问题:是否可以使用相同的代码库以相同的方式处理“数据块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
                        )

                )

        )

)
php arrays sorting multidimensional-array php-7.3
2个回答
0
投票

尝试一下

<?php
// 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 = 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,array());
            array_push($newArray_1[$i], $newkey);
            array_push($newArray_1[$i], array());
            $k=array();
            array_push($k, $elements);
            $newArray_1[$i][1]=array('balance' => $k);
            $i++;

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

    }

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

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

?>

0
投票

您可以遍历$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
                                )
                        )
                )
        )
)
© www.soinside.com 2019 - 2024. All rights reserved.