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