gpt4 book ai didi

PHP 嵌套数组 : Imploding all the tree keys of each leaf results in a multidimensional array instead of a 1D associative one

转载 作者:行者123 更新时间:2023-12-04 15:11:32 24 4
gpt4 key购买 nike

我想从嵌套数组生成一维关联数组,其中包含每个叶子的升序键串联。

总结

  1. 预期结果示例

    1.1。输入

    1.2。输出

  2. 实际结果示例

    1.1。输入

    1.2。输出

  3. 问题

  4. 最小的、可测试的可执行源

    4.1。说明

    4.2。来源和执行


预期结果示例

输入

下面的嵌套数组:

[
'key1' => 'foo',
'key2' => [
'key3' => [
0 => ['key4' => 'bar' ],
1 => ['key4' => 'azerty']
]
]
]

输出

以下一维关联数组(连接键的胶水字符:_):

[
'key1' => 'foo',
'key2_key3_0_key4' => 'bar',
'key2_key3_1_key4' => 'azerty'
]

实际结果示例

输入

[
'etat' => 'bar',
'proposition_en_cours' => [
'fichiers' => [
0 => ['url_fichier' => 'foo' ],
1 => ['url_fichier' => 'bar']
]
]
]

输出

Array
(
[] => bar
[proposition_en_cours] => Array
(
[fichiers] => Array
(
[0] => Array
(
[url_fichier] => foo
)

[1] => Array
(
[url_fichier] => bar
)

)

)

[proposition_en_cours_fichiers] => Array
(
[0] => Array
(
[url_fichier] => foo
)

[1] => Array
(
[url_fichier] => bar
)

)

[proposition_en_cours_fichiers_0] => foo
[proposition_en_cours_fichiers_0_1] => bar
)

问题

如您所见,我得到的数组在所有方面都与预期的不同。我不明白为什么。

最小的、可测试的可执行源

说明

我初始化一个数组,该数组必须包含每个叶子的所有升序键:$key_in_db_format = [];

我迭代输入数组。对于每个元素(叶或子数组),当且仅当当前深度等于最后一个深度时,我才会弹出 $key_in_db_format。如果它是一个数组(即: 不是叶子):我将键添加到 $key_in_db_format。我在键上设置了一个值(叶子),它是升序键的串联。

来源与执行

  1. 首先,在您选择的空 PHP 脚本中定义此数组:

    $values = [

    'etat' => 'bar',

    'proposition_en_cours' => [
    'fichiers' => [
    0 => [ 'url_fichier' => 'foo' ],
    1 => [ 'url_fichier' => 'bar' ]
    ]
    ]

    ];
  2. 然后,复制/粘贴以下代码即可执行:

     $values_to_insert_in_meta_table = [];

    $iterator = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($values), \RecursiveIteratorIterator::SELF_FIRST);
    $last_depth = 0;
    $key_in_db_format = [];
    foreach ($iterator as $value_key_field => $value_value_field) {
    if($iterator->getDepth() == $last_depth) {
    array_pop($key_in_db_format);
    }

    if(is_array($value_value_field)) {
    array_push($key_in_db_format, $value_key_field);
    } else {
    $values_to_insert_in_meta_table[implode('_', $key_in_db_format)] = $value_value_field;
    }


    $last_depth = $iterator->getDepth();
    }

    echo '<pre>';
    print_r($values_to_insert_in_meta_table);

最佳答案

也许我错过了什么,但据我所知,我会做这样的事情:

<?php

function flatten(array $array, ?string $prefix = null): array {
$prefix = $prefix === null ? '' : "{$prefix}_";
$output = [];

foreach ($array as $key => $value) {
$key = $prefix . $key;

if (is_array($value)) {
$output = array_merge($output, flatten($value, $key));
} else {
$output[$key] = $value;
}
}

return $output;
}

var_export(flatten([
'key1' => 'foo',
'key2' => [
'key3' => [
0 => ['key4' => 'bar' ],
1 => ['key4' => 'azerty']
]
]
]));

输出:

array (
'key1' => 'foo',
'key2_key3_0_key4' => 'bar',
'key2_key3_1_key4' => 'azerty',
)

关于PHP 嵌套数组 : Imploding all the tree keys of each leaf results in a multidimensional array instead of a 1D associative one,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65159230/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com