簡體   English   中英

PHP重新格式化嵌套數組

[英]php reformat nested array

我有一個存儲的無限嵌套級別數組,其中包含不需要的額外數據。

$arr = array(
    array(
        'name' => 'item1',
        'level' => 0,
        'extra_key' => 'some_data',
        'children' => array(
            'name' => 'sub-item1',
            'level' => 1,
            'extra_key' => 'some_data',
            'children' => array(
                'name' => 'sub-sub-item1',
                'level' => 2,
                'extra_key' => 'some_data',
                'children' => array()
            ),
            array(
                'name' => 'sub-sub2-item1',
                'level' => 2,
                'extra_key' => 'some_data',
                'children' => array()
            ),
        )
    ),
    array(
        'name' => 'item2',
        'level' => 0,
        'extra_key' => 'some_data',
        'children' => array(
            'name' => 'sub-item2',
            'level' => 2,
            'extra_key' => 'some_data',
            'children' => array(
                'name' => 'sub-sub-item2',
                'level' => 2,
                'extra_key' => 'some_data',
                'children' => array()
            ),
            array(
                'name' => 'sub-sub2-item2',
                'level' => 2,
                'extra_key' => 'some_data',
                'children' => array()
            ),
        )
    ),
    array(
        'name' => 'item3',
        'level' => 0,
        'extra_key' => 'some_data',
        'children' => array(
            'name' => 'sub-item3',
            'level' => 1,
            'extra_key' => 'some_data',
            'children' => array(
                'name' => 'sub-sub-item3',
                'level' => 2,
                'extra_key' => 'some_data',
                'children' => array()
            ),
            array(
                'name' => 'sub-sub2-item3',
                'level' => 2,
                'extra_key' => 'some_data',
                'children' => array()
            ),
        )
    ),
);

預期的輸出數組:

$arr = array(
    array(
        'name' => 'item1',
        'nodes' => array(
            'name' => 'sub-item1',
            'nodes' => array(
                'name' => 'sub-sub-item1',
                'nodes' => array()
            ),
            array(
                'name' => 'sub-sub2-item1',
                'nodes' => array()
            ),
        )
    ),
    array(
        'name' => 'item2',
        'nodes' => array(
            'name' => 'sub-item2',
            'nodes' => array(
                'name' => 'sub-sub-item2',
                'nodes' => array()
            ),
            array(
                'name' => 'sub-sub2-item2',
                'nodes' => array()
            ),
        )
    ),
    array(
        'name' => 'item3',
        'nodes' => array(
            'name' => 'sub-item3',
            'nodes' => array(
                'name' => 'sub-sub-item3',
                'nodes' => array()
            ),
            array(
                'name' => 'sub-sub2-item3',
                'nodes' => array()
            ),
        )
    )
);

我想刪除不必要的按鍵,例如levelextra_key從各個層次,我想也改變鍵的名稱childrennodes ,然后用新的格式相同的結構重現相同的陣列。

我該如何實現?

我試圖通過遞歸函數來做到這一點,但我無法復制相同的結構

您的結構沒有意義,可能是因為您無法編寫遞歸函數。 如果有可能更改結構,我建議使用重新格式化功能實現這一點:

<?php

$actual = array(
    array(
        'name' => 'item1',
        'level' => 0,
        'extra_key' => 'some_data',
        'children' => array(
            array(
                'name' => 'sub-item1',
                'level' => 1,
                'extra_key' => 'some_data',
                'children' => array(
                    array(
                        'name' => 'sub-sub-item1',
                        'level' => 2,
                        'extra_key' => 'some_data',
                        'children' => array()
                    ),
                    array(
                        'name' => 'sub-sub2-item1',
                        'level' => 2,
                        'extra_key' => 'some_data',
                        'children' => array()
                    ),
                )
            ),
        )
    ),
);

$expected = array(
    array(
        'name' => 'item1',
        'nodes' => array(
            array(
                'name' => 'sub-item1',
                'nodes' => array(
                    array(
                        'name' => 'sub-sub-item1',
                        'nodes' => array()
                    ),
                    array(
                        'name' => 'sub-sub2-item1',
                        'nodes' => array()
                    ),
                ),
            ),
        )
    ),
);

function change_array($original)
{
    return array_map('change_node', $original);
}

function change_node($node)
{
    return [
        'name' => $node['name'],
        'nodes' => array_map('change_node', $node['children']),
    ];
}

var_dump($expected === change_array($actual));

此函數將遞歸執行您想要的操作。 您可以根據需要添加額外的排除索引和/或重命名索引;

function parseArray($array): array
{
    // The resulting array
    $result          = [];
    // Indices you want renamed [`from` => `to`]
    $renameIndices   = ['children' => 'nodes'];
    // Indices you want excluded [`1`, `2`]
    $excludedIndices = ['level', 'extra_key'];
    foreach ($array as $idx => $content)
    {
        // If excluded, continue (skip) node.
        if (in_array($idx, $excludedIndices, true))
        {
            continue;
        }
        // Setting the resulting (new) index.
        $resultIdx = $idx;
        // Check if this index should be renamed
        if (array_key_exists($idx, $renameIndices))
        {
            // If index should be renamed, apply new name
            $resultIdx = $renameIndices[$idx];
        }
        // If this content block is an array. Parse it.
        if (is_array($content))
        {
            $content = parseArray($content);
        }
        // Save content to resulting array.
        $result[$resultIdx] = $content;
    }

    return $result;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM