php中的转换数组结构
如果我有一个来自如下数据库的数组:php中的转换数组结构,php,arrays,symfony,Php,Arrays,Symfony,如果我有一个来自如下数据库的数组: $array = [ 'dataset_1' => [ 'some' => '...', 'array' => '...', ], 'dataset_2' => [ 'some' => '...', 'thing' => '...', 'else' => '...', ] ]; 。。。如何将此数
$array = [
'dataset_1' => [
'some' => '...',
'array' => '...',
],
'dataset_2' => [
'some' => '...',
'thing' => '...',
'else' => '...',
]
];
。。。如何将此数组转换为其他结构,如:
$array = [
'whatever' => [
'some' =>'...',
'array' => '...',
'some' =>'...',
'thing' => '...',
'else' => '...',
]
];
我考虑过OptionResolver,但我不知道是否有人可以给我一个提示或示例?在下面的两个示例中,您将松开重复键“some”
$a = [
'dataset_1'=>[
'some' =>'...',
'array' => '...', ],
'dataset_2'=>[
'some' =>'...',
'thing' => '...',
'else' => '...',
]
];
// You can use array union operator
$b = $a['dataset_1'] + $a['dataset_2'];
// Or you can use array merge.
$b = array_merge($a['dataset_1'], $a['dataset_2']);
在下面的两个示例中,您将松开重复键“some”
$a = [
'dataset_1'=>[
'some' =>'...',
'array' => '...', ],
'dataset_2'=>[
'some' =>'...',
'thing' => '...',
'else' => '...',
]
];
// You can use array union operator
$b = $a['dataset_1'] + $a['dataset_2'];
// Or you can use array merge.
$b = array_merge($a['dataset_1'], $a['dataset_2']);
如果您有uknown数量的数据集,您可以使用和来获得结果。不过要小心,因为数组中有重复的密钥,这意味着除了一个密钥外,您将丢失所有重复的密钥。考虑使用唯一键:
$input = array(
'dataset_1'=>[
'some' =>'...',
'array' => '...', ],
'dataset_2'=>[
'some' =>'...',
'thing' => '...',
'else' => '...',
]
);
$output['whatever'] = array_merge(...array_values($input));
print_r($output);
输出:
Array
(
[whatever] => Array
(
[some] => ...
[array] => ...
[thing] => ...
[else] => ...
)
)
Array (
[whatever] => Array (
[some] => ...
[array] => ...
[some1] => ...
[thing] => ...
[else] => ...
[some2] => ...
[thing1] => ...
[else1] => ...
[some3] => ...
[thing2] => ...
[else2] => ...
)
)
如果您有uknown数量的数据集,您可以使用和来获得结果。不过要小心,因为数组中有重复的密钥,这意味着除了一个密钥外,您将丢失所有重复的密钥。考虑使用唯一键:
$input = array(
'dataset_1'=>[
'some' =>'...',
'array' => '...', ],
'dataset_2'=>[
'some' =>'...',
'thing' => '...',
'else' => '...',
]
);
$output['whatever'] = array_merge(...array_values($input));
print_r($output);
输出:
Array
(
[whatever] => Array
(
[some] => ...
[array] => ...
[thing] => ...
[else] => ...
)
)
Array (
[whatever] => Array (
[some] => ...
[array] => ...
[some1] => ...
[thing] => ...
[else] => ...
[some2] => ...
[thing1] => ...
[else1] => ...
[some3] => ...
[thing2] => ...
[else2] => ...
)
)
要避免覆盖重复的键,请使用此选项。因此,数组中的重复键将依次取一个整数
// New array
foreach ($array as $key => $sub_array):
foreach ($sub_array as $sub_key => $value):
if (array_key_exists($sub_key,$new_array['whatever'])) {
$i{$sub_key} = !isset($i{$sub_key}) ? 0 : $i{$sub_key};
$sub_key = $sub_key . ++$i{$sub_key};
}
$new_array['whatever'][$sub_key] = $value;
endforeach;
endforeach;
例如:
// Array
$array = [
'dataset_1' => [
'some' => '...',
'array' => '...',
],
'dataset_2' => [
'some' => '...',
'thing' => '...',
'else' => '...',
],
'dataset_3' => [
'some' => '...',
'thing' => '...',
'else' => '...',
]
];
// New array
// the code...
print_r($new_array);
输出:
Array
(
[whatever] => Array
(
[some] => ...
[array] => ...
[thing] => ...
[else] => ...
)
)
Array (
[whatever] => Array (
[some] => ...
[array] => ...
[some1] => ...
[thing] => ...
[else] => ...
[some2] => ...
[thing1] => ...
[else1] => ...
[some3] => ...
[thing2] => ...
[else2] => ...
)
)
要避免覆盖重复的键,请使用此选项。因此,数组中的重复键将依次取一个整数
// New array
foreach ($array as $key => $sub_array):
foreach ($sub_array as $sub_key => $value):
if (array_key_exists($sub_key,$new_array['whatever'])) {
$i{$sub_key} = !isset($i{$sub_key}) ? 0 : $i{$sub_key};
$sub_key = $sub_key . ++$i{$sub_key};
}
$new_array['whatever'][$sub_key] = $value;
endforeach;
endforeach;
例如:
// Array
$array = [
'dataset_1' => [
'some' => '...',
'array' => '...',
],
'dataset_2' => [
'some' => '...',
'thing' => '...',
'else' => '...',
],
'dataset_3' => [
'some' => '...',
'thing' => '...',
'else' => '...',
]
];
// New array
// the code...
print_r($new_array);
输出:
Array
(
[whatever] => Array
(
[some] => ...
[array] => ...
[thing] => ...
[else] => ...
)
)
Array (
[whatever] => Array (
[some] => ...
[array] => ...
[some1] => ...
[thing] => ...
[else] => ...
[some2] => ...
[thing1] => ...
[else1] => ...
[some3] => ...
[thing2] => ...
[else2] => ...
)
)
在确保没有重复键的情况下,一种简单的方法是使用递归循环连接父键和子键:
$array = [
'dataset_1' => [
'some' => '...',
'array' => '...',
],
'dataset_2' => [
'some' => '...',
'thing' => '...',
'else' => '...',
]
];
$flat_array = [];
foreach($array as $dataset => $data){
foreach($data as $index => $value){
$flat_array[$dataset . '_' . $index] = $value;
}
}
var_export($flat_array);
产出:
array (
'dataset_1_some' => '...',
'dataset_1_array' => '...',
'dataset_2_some' => '...',
'dataset_2_thing' => '...',
'dataset_2_else' => '...',
)
array (
'dataset_1_some' => '...',
'dataset_1_array' => '...',
'dataset_2_some' => '...',
'dataset_2_thing' => '...',
'dataset_2_else_cheese_ball' => true,
'dataset_2_else_cheese_wheel' => false,
)
如果数据变得更复杂,您可以在可以处理多个嵌套层的递归函数中应用相同的逻辑:
$array = [
'dataset_1' => [
'some' => '...',
'array' => '...',
],
'dataset_2' => [
'some' => '...',
'thing' => '...',
'else' => [
'cheese' => [
'ball' => true,
'wheel' => false
],
],
]
];
function array_flatten ($array)
{
$result = [];
foreach($array as $i => $value)
{
if(!is_array($value)){
$result[$i] = $value;
}else{
// pass array $value back to this same function
$sub_result = array_flatten($value);
foreach($sub_result as $subI => $subV)
{
// concatenate this index with each sub-index
// to get result index for each sub-value
$result[$i . '_' . $subI] = $subV;
}
}
}
return $result;
}
var_export(array_flatten($array));
产出:
array (
'dataset_1_some' => '...',
'dataset_1_array' => '...',
'dataset_2_some' => '...',
'dataset_2_thing' => '...',
'dataset_2_else' => '...',
)
array (
'dataset_1_some' => '...',
'dataset_1_array' => '...',
'dataset_2_some' => '...',
'dataset_2_thing' => '...',
'dataset_2_else_cheese_ball' => true,
'dataset_2_else_cheese_wheel' => false,
)
在确保没有重复键的情况下,一种简单的方法是使用递归循环连接父键和子键:
$array = [
'dataset_1' => [
'some' => '...',
'array' => '...',
],
'dataset_2' => [
'some' => '...',
'thing' => '...',
'else' => '...',
]
];
$flat_array = [];
foreach($array as $dataset => $data){
foreach($data as $index => $value){
$flat_array[$dataset . '_' . $index] = $value;
}
}
var_export($flat_array);
产出:
array (
'dataset_1_some' => '...',
'dataset_1_array' => '...',
'dataset_2_some' => '...',
'dataset_2_thing' => '...',
'dataset_2_else' => '...',
)
array (
'dataset_1_some' => '...',
'dataset_1_array' => '...',
'dataset_2_some' => '...',
'dataset_2_thing' => '...',
'dataset_2_else_cheese_ball' => true,
'dataset_2_else_cheese_wheel' => false,
)
如果数据变得更复杂,您可以在可以处理多个嵌套层的递归函数中应用相同的逻辑:
$array = [
'dataset_1' => [
'some' => '...',
'array' => '...',
],
'dataset_2' => [
'some' => '...',
'thing' => '...',
'else' => [
'cheese' => [
'ball' => true,
'wheel' => false
],
],
]
];
function array_flatten ($array)
{
$result = [];
foreach($array as $i => $value)
{
if(!is_array($value)){
$result[$i] = $value;
}else{
// pass array $value back to this same function
$sub_result = array_flatten($value);
foreach($sub_result as $subI => $subV)
{
// concatenate this index with each sub-index
// to get result index for each sub-value
$result[$i . '_' . $subI] = $subV;
}
}
}
return $result;
}
var_export(array_flatten($array));
产出:
array (
'dataset_1_some' => '...',
'dataset_1_array' => '...',
'dataset_2_some' => '...',
'dataset_2_thing' => '...',
'dataset_2_else' => '...',
)
array (
'dataset_1_some' => '...',
'dataset_1_array' => '...',
'dataset_2_some' => '...',
'dataset_2_thing' => '...',
'dataset_2_else_cheese_ball' => true,
'dataset_2_else_cheese_wheel' => false,
)
实际上,我是通过构建一个目标阵列作为模板来实现的,如:
Source array:
$array = [
'dataset_1' => [
'keyFromSourceArray' => 'someValue',
'array' => '...',
];
目标阵列:
$array = [
'dataset_somename' => [
'dataset_somename' => [
'some' => 'keyFromSourceArray',
'array' => '...',
],
];
然后,我在源数组中循环,抓取键,在目标数组中搜索并替换为值,如:
public function array2api($needle, $array=false, array $path = []) {
foreach ($array as $key => $value) {
$currentPath = array_merge($path, [$key]);
if (is_array($value) && $result = $this->array2api($needle, $value, $currentPath)) {
return $result;
} else if ($value === $needle) {
return $currentPath;
}
}
return false;
}
这是工作,但它是-我想有点费力。由于我无法从数据库中获取源数据,因此我必须对其进行转换。但我想有一个更简单的解决方案,我还没有得到。实际上,我是通过构建一个目标阵列作为模板来实现的,比如:
Source array:
$array = [
'dataset_1' => [
'keyFromSourceArray' => 'someValue',
'array' => '...',
];
目标阵列:
$array = [
'dataset_somename' => [
'dataset_somename' => [
'some' => 'keyFromSourceArray',
'array' => '...',
],
];
然后,我在源数组中循环,抓取键,在目标数组中搜索并替换为值,如:
public function array2api($needle, $array=false, array $path = []) {
foreach ($array as $key => $value) {
$currentPath = array_merge($path, [$key]);
if (is_array($value) && $result = $this->array2api($needle, $value, $currentPath)) {
return $result;
} else if ($value === $needle) {
return $currentPath;
}
}
return false;
}
这是工作,但它是-我想有点费力。由于我无法从数据库中获取源数据,因此我必须对其进行转换。但我想有一个更简单的解决方案,我还没有得到。这是否意味着你要合并这两个数组?数组中不能有两个相同的键(
某些
)(无效数组…),那么,你当前的尝试是什么样子的,会产生什么结果?一个粗略的问题。您不需要选项解析程序来执行此操作。尝试在数据集上循环并合并它们。这是否意味着您要合并这两个数组?数组中不能有两个相同的键(some
)(无效数组…),那么,您当前的尝试是什么样子的,会产生什么样的结果?一个粗略的问题。您不需要选项解析程序来执行此操作。尝试在数据集上循环并合并它们。