用每个叶片的键值对替换多维行



我想弄平一个行的数组 - 每个行都具有可变的深度 - 使其成为一系列关联数组。

我在这里尝试了一些非常好的示例,这些示例适用于关联或多维数组,但无法将它们放在一起解决我的问题:

Array
(
    [0] => Array
        (
            [level2_1] => aa
            [level2_2] => bb
            [level2_3] => cc
            [level2_4] => Array
                (
                    [level3_1] => DDD
                    [level3_2] => EEE
                )
        )
    [1] => Array
        (
            [level2_1] => ff
            [level2_2] => gg
            [level2_3] => hh
            [level2_4] => Array
                (
                    [level3_1] => III
                    [level3_2] => JJJ
                )
        )
)

预期输出:

0 -> level2_1: aa, level2_2: bb, level2_3: cc, level3_1: DDD, level3_2: EEE
1 -> level2_1: ff, level2_2: gg, level2_3: hh, level3_1: III, level3_2: JJJ

或至少:

0: aa, bb, cc, DDD, EEE
1: ff, gg, hh, III, JJJ

我尝试了许多有关爆破,多维的非环答案。我认为,如果其中一个元素(Level2_4)是数组而不是字符串,则需要进行一些修改。

这是我发现工作的一些好的代码样本,但需要修改以适合我的案例:

#基本,但停在子阵列上:

echo爆炸(',',call_user_func_array('array_merge',$ data));

#php爆破联想数组:

umpode(',',array_map(函数($ k,$ v){return $ k:$ v&v"},array_keys($ data),array_values($ data));

>

#php爆破多维数组:

$结果[0] [代码] =" quert;;

$结果[0] [desc] =" desc123"

$结果[1] [代码] =" 567;

$结果[1] [desc] =" desc567"

echo爆炸(',',array_map(函数($ k,$ v){return $ k:$ k:$ v"},array_keys(array_column($ result,'desc,'desc'code'code')),array_values(array_column($ result,'desc','code'code'))));

array_keys array_walk_recursive array_map功能的组合:

// $arr is your initial array
$result = array_map(function($k) use($arr){
    $s = "$k ->";   // key prefix
    array_walk_recursive($arr[$k], function($v, $k) use(&$s){
        $s .= " $k: $v,";
    });
    return trim($s, ',');
}, array_keys($arr));
print_r($result);

输出:

Array
(
    [0] => 0 -> level2_1: aa, level2_2: bb, level2_3: cc, level3_1: DDD, level3_2: EEE
    [1] => 1 -> level2_1: ff, level2_2: gg, level2_3: hh, level3_1: III, level3_2: JJJ
)

可能是,您可以尝试其他方式:

<?php
function Recursive($data){
$ritit = new RecursiveIteratorIterator(new RecursiveArrayIterator($data));
$result = array();
foreach ($ritit as $leafValue) {
$keys = array();
foreach (range(0, $ritit->getDepth()) as $depth) {
$keys[] = $ritit->getSubIterator($depth)->key();
}
$result[ join('.', $keys) ] = $leafValue;
}
return $result;
}
$data =
[
        [
            'level2_1' => 'aa',
            'level2_2' => 'bb',
            'level2_3' => 'cc',
            'level2_4' =>
                [
                    'level3_1' => 'DDD',
                    'level3_2' => 'EEE'
                ]
         ],
         [
            'level2_1' => 'ff',
            'level2_2' => 'gg',
            'level2_3' => 'hh',
            'level2_4' =>
                [
                    'level3_1' => 'III',
                    'level3_2' => 'JJJ'
                ]
        ]
];  
$recursive = Recursive($data);
echo "<pre>".print_r($recursive,1)."<pre>";
?>

输出:

Array
(
    [0.level2_1] => aa
    [0.level2_2] => bb
    [0.level2_3] => cc
    [0.level2_4.level3_1] => DDD
    [0.level2_4.level3_2] => EEE
    [1.level2_1] => ff
    [1.level2_2] => gg
    [1.level2_3] => hh
    [1.level2_4.level3_1] => III
    [1.level2_4.level3_2] => JJJ
)

几乎在那里,但对于拖延逗号。

<?php
$data =
[
        [
            'level2_1' => 'aa',
            'level2_2' => 'bb',
            'level2_3' => 'cc',
            'level2_4' =>
                [
                    'level3_1' => 'DDD',
                    'level3_2' => 'EEE'
                ]
         ],
         [
            'level2_1' => 'ff',
            'level2_2' => 'gg',
            'level2_3' => 'hh',
            'level2_4' =>
                [
                    'level3_1' => 'III',
                    'level3_2' => 'JJJ'
                ]
        ]
];  
array_walk($data, function($v, $k) {
    print "$k ->";
    array_walk_recursive($v, function($v, $k) {
        printf(' %s: %s,', $k, $v);
    });
    print "n";
});

输出:

0 -> level2_1: aa, level2_2: bb, level2_3: cc, level3_1: DDD, level3_2: EEE,
1 -> level2_1: ff, level2_2: gg, level2_3: hh, level3_1: III, level3_2: JJJ,

并修复尾逗号将printf线换成:

print rtrim(sprintf(' %s: %s,', $k, $v),',');

最新更新