Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php中的转换数组结构_Php_Arrays_Symfony - Fatal编程技术网

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
)(无效数组…),那么,您当前的尝试是什么样子的,会产生什么样的结果?一个粗略的问题。您不需要选项解析程序来执行此操作。尝试在数据集上循环并合并它们。