我有以下数组:
rdd2
我如何转换成这样的结构?
'values' => [
'protein_question_0_typing_method' => '38'
'protein_question_0_amount_1' => '1'
'protein_question_0_amount_2' => '2'
'protein_question_0_units_of_measurement' => '17'
'protein_question_1_typing_method' => '39'
'protein_question_1_amount_1' => '2'
'protein_question_1_amount_2' => '2'
'protein_question_1_units_of_measurement' => '17'
'protein_question_2_typing_method' => '42'
'protein_question_2_amount_1' => '2'
'protein_question_2_amount_2' => '2'
'protein_question_2_units_of_measurement' => '17'
'distributionId' => '21'
]
这是我尝试过的:
'values' => [
0 => [
'protein_question_typing_method' => '38',
'protein_question_amount_1' => '1',
'protein_question_amount_2' => '2'
],
1 => [
'protein_question_typing_method' => '42',
'protein_question_amount_1' => '1',
'protein_question_amount_2' => '2'
],
...
'distributionId' => '21'
]
上面的代码只是打印数据,因为我需要以分块格式提供数据,因为每个块都会被保存为数据库中的新模型记录。
所以基本上只需要将它转换为索引数组,任何人都知道最简单的方法,因为循环第一个数组会很复杂吗?
由于
答案 0 :(得分:1)
可以做到
$input = [
'values' => [
'protein_question_0_typing_method' => '38',
'protein_question_0_amount_1' => '1',
'protein_question_0_amount_2' => '2',
'protein_question_0_units_of_measurement' => '17',
'protein_question_1_typing_method' => '39',
'protein_question_1_amount_1' => '2',
'protein_question_1_amount_2' => '2',
'protein_question_1_units_of_measurement' => '17',
'protein_question_2_typing_method' => '42',
'protein_question_2_amount_1' => '2',
'protein_question_2_amount_2' => '2',
'protein_question_2_units_of_measurement' => '17',
'distributionId' => '21'
]
];
$output = [];
foreach ($input["values"] as $key => $value) {
if (preg_match('#^protein_question_(\d+)_(.+)$#', $key, $match)) {
$output[$match[1]]['protein_question_' . $match[2]] = $value;
} else {
$output[$key] = $value;
}
}
var_dump($output);
这将迭代数组中的所有键,如果以protein_question开头,后跟一个数字,后跟一些文本,则匹配。如果是,则将该数字用作输出中的索引,以保持键减去数字和值。如果它不匹配,则按键和值按原样放置。
会给出
array(4) {
[0]=>
array(4) {
["protein_question_typing_method"]=>
string(2) "38"
["protein_question_amount_1"]=>
string(1) "1"
["protein_question_amount_2"]=>
string(1) "2"
["protein_question_units_of_measurement"]=>
string(2) "17"
}
[1]=>
array(4) {
["protein_question_typing_method"]=>
string(2) "39"
["protein_question_amount_1"]=>
string(1) "2"
["protein_question_amount_2"]=>
string(1) "2"
["protein_question_units_of_measurement"]=>
string(2) "17"
}
[2]=>
array(4) {
["protein_question_typing_method"]=>
string(2) "42"
["protein_question_amount_1"]=>
string(1) "2"
["protein_question_amount_2"]=>
string(1) "2"
["protein_question_units_of_measurement"]=>
string(2) "17"
}
["distributionId"]=>
string(2) "21"
}
答案 1 :(得分:0)
这是一个非常基本的实现,可以根据您的特定需求进行调整:
<?php
$values = [
'protein_question_0_typing_method' => '38',
'protein_question_0_amount_1' => '1',
'protein_question_0_amount_2' => '2',
'protein_question_0_units_of_measurement' => '17',
'protein_question_1_typing_method' => '39',
'protein_question_1_amount_1' => '2',
'protein_question_1_amount_2' => '2',
'protein_question_1_units_of_measurement' => '17',
'protein_question_2_typing_method' => '42',
'protein_question_2_amount_1' => '2',
'protein_question_2_amount_2' => '2',
'protein_question_2_units_of_measurement' => '17',
'distributionId' => '21'
];
function convert($values) {
$result = [];
foreach ($values as $key => $value) {
$matches = [];
$ret = preg_match('~^protein_question_([0-9]+)_~U', $key, $matches);
// Key does not match the pattern protein_question_*_
if ($ret !== 1) {
$result[$key] = $value;
continue;
}
$proteinQuestionID = (int)$matches[1];
// Create key for the this ID
if (!isset($result[$proteinQuestionID])) {
$result[$proteinQuestionID] = [];
}
// Adjust the key...
$key = \substr($key, \strlen('protein_question_'.$proteinQuestionID));
$key = 'protein_question'.$key;
// Append to it...
$result[$proteinQuestionID][$key] = $value;
}
return $result;
}
print_r(convert($values));
答案 2 :(得分:-1)
你尝试过array_chunk($ your_array,4)。它看起来这种方法可以帮助你