Méthode PHP pour aplatir un tableau arborescent et le mapper à la clé d'un nouveau format de tableau => valeur
P粉563831052
P粉563831052 2023-09-03 20:28:52
0
2
540
<p>我有一个在php中的复杂数组,像这样:</p> <pre class="brush:php;toolbar:false;">[ 0 => [ 'id' => '2' 'parent_id' => '1' 'text' => 'Algoritma' 'lvl' => '1' 'nodes' => [ 0 => [ 'id' => '11' 'parent_id' => '2' 'text' => 'Flowchart' 'lvl' => '2' 'href' => '/site/read-by-type?id=11' ] 1 => [ 'id' => '12' 'parent_id' => '2' 'text' => 'Pseudo code' 'lvl' => '2' 'href' => '/site/read-by-type?id=12' ] ] 'href' => '/site/read-by-type?id=2' ] 1 => [ 'id' => '3' 'parent_id' => '1' 'text' => 'Pemrograman' 'lvl' => '1' 'nodes' => [ 0 => [ 'id' => '4' 'parent_id' => '3' 'text' => 'Java' 'lvl' => '2' 'href' => '/site/read-by-type?id=4' ] 1 => [ 'id' => '5' 'parent_id' => '3' 'text' => 'PHP' 'lvl' => '2' 'nodes' => [ 0 => [ 'id' => '8' 'parent_id' => '5' 'text' => 'Yii2 Framework' 'lvl' => '3' 'href' => '/site/read-by-type?id=8' ] 1 => [ 'id' => '9' 'parent_id' => '5' 'text' => 'Laravel' 'lvl' => '3' 'href' => '/site/read-by-type?id=9' ] ] 'href' => '/site/read-by-type?id=5' ] 2 => [ 'id' => '7' 'parent_id' => '3' 'text' => 'Javascript' 'lvl' => '2' 'href' => '/site/read-by-type?id=7' ] ] 'href' => '/site/read-by-type?id=3' ] 2 => [ 'id' => '10' 'parent_id' => '1' 'text' => 'Sistem Operasi' 'lvl' => '1' 'nodes' => [ 0 => [ 'id' => '13' 'parent_id' => '10' 'text' => 'Mac OS' 'lvl' => '2' 'href' => '/site/read-by-type?id=13' ] 1 => [ 'id' => '14' 'parent_id' => '10' 'text' => 'Linux' 'lvl' => '2' 'href' => '/site/read-by-type?id=14' ] ] 'href' => '/site/read-by-type?id=10' ] ]</pre> <p>我需要将这些数组展平为键值对的格式,即 ['id' => 'text']:</p> <pre class="brush:php;toolbar:false;">[ 2 => ' Algoritma' // 基于这些级别,有1个空格 11 => ' Flowchart', // 基于这些级别,有2个空格 12 => ' Pseudo code', // 基于这些级别,有2个空格 3 => ' Pemrograman' // 基于这些级别,有1个空格 4 => ' Java' // 基于这些级别,有2个空格 5 => ' PHP' // 基于这些级别,有2个空格 8 => ' Yii2 Framework' // 基于这些级别,有3个空格 9 => ' Laravel' // 基于这些级别,有3个空格 10 => ' Sistem Operasi' // 基于这些级别,有1个空格 ... 以此类推 ]</pre> <p>到目前为止,我写了这样的代码:</p> <pre class="brush:php;toolbar:false;">public static function flattingTree(array $tree){ $denormalizeTree = []; foreach ($tree as $node) { if(isset($node['nodes'])){ // 我被卡住了... } $denormalizeTree[$node['id']] = $node['text']; } return $denormalizeTree; }</pre> <p>但我只得到了一层:</p> <pre class="brush:php;toolbar:false;">[ 2 => 'Algoritma' 3 => 'Pemrograman' 10 => 'Sistem Operasi' ]</pre> <p>非常感谢任何帮助...</p>
P粉563831052
P粉563831052

répondre à tous(2)
P粉043470158

Vous êtes plus proche que vous ne le pensez. Appelez simplement votre fonction de manière récursive et ajoutez les résultats au tableau final.

public function flattingTree(array $tree)
{
    $denormalizeTree = [];
    foreach ($tree as $node) {
        if (isset($node['nodes'])) {
            $denormalizeTree += $this->flattingTree($node['nodes']);
        }
        $denormalizeTree[$node['id']] = $node['text'];
    }

    return $denormalizeTree;
}

Résultat :

$result = $this->flattingTree($array); 
print_r($result);

Array
(
    [11] => Flowchart
    [12] => Pseudo code
    [2] => Algoritma
    [4] => Java
    [8] => Yii2 Framework
    [9] => Laravel
    [5] => PHP
    [7] => Javascript
    [3] => Pemrograman
    [13] => Mac OS
    [14] => Linux
    [10] => Sistem Operasi
)
P粉807397973

Une solution rapide consiste à utiliser une fonction récursive pour parcourir le tableau et ajouter les données requises au tableau final.

La clé est d'avoir une fonction qui accepte un tableau "non étendu" et une variable pour contenir les données (les données seront conservées dans cette variable). Le dernier argument sera passé par référence afin que la variable elle-même soit mutée pour contenir les données.

function extract($arr, &$saveInto) {
    foreach ($arr as $el) {
        isset($el['id'], $el['text']) && ($saveInto[$el['id']] = $el['text']);
        isset($el['nodes']) && extract($el['nodes'], $saveInto); // 递归调用
    }
}

À l'aide de la fonction ci-dessus, vous pouvez développer le tableau en l'appelant et en spécifiant une variable pour enregistrer le résultat.

$unflattenedArr = [ ... ]; // 要展开的数组
$finalArr = []; // 将保存结果的数组
extract($unflattenedArr, $finalArr);
// 此时 $finalArr 中保存了所需的结果。

Pour simplifier les choses, vous pouvez encapsuler la fonction extract et vous n'avez plus besoin de préparer un tableau vide pour enregistrer le résultat.

function flatten($arr) {
    $r = []; // 此函数准备一个空变量
    extract($arr, $r); // 将其传递给“extract”函数
    return $r; // 然后返回带有所需结果的变量
}

Maintenant, les tableaux peuvent être étendus comme suit :

$unflattenedArr = [ ... ]; // 要展开的数组
$finalArr = flatten($unflattenedArr); // 调用封装了“extract”函数的新函数
// 此时 $finalArr 中保存了所需的结果。

J'espère vous avoir aidé davantage.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal