2017-04-19 1 views
1

Je suis en train de tordre mon cerveau en essayant de convertir un tableau associatif multidimensionnel en un tableau multidimensionnel non associatif et je suis arrivé au point où j'ai décidé demander de l'aide ..Conversion de tableau associatif multidimensionnel PHP (structure de dossier URL en tant que tableau hiérarchique)

L'histoire:

R. J'ai un ensemble d'URL et leurs indicateurs de performance clés (avec une profondeur de dossier arbitraire):

URL

, Visites

  1. www.example.com
  2. www.example.com/resource1, 100
  3. www.example.com/folderA/resource2, 200
  4. www.example.com/folderA/resource3, 300
  5. www .example.com/FolderB/resource4, 400

B. Avec l'aide de StackOverflow (et étonnamment quelques lignes de PHP -> voir here) J'ai pu le transformer en un tableau hiérarchique, ce qui représente l'URL structure comme dossiers:

Array 
(
[www.example.com] => Array 
    (
     [folderA] => Array 
      (
       [resource2] => Array 
        (
         [visits] => 200 
        ) 

       [resource3] => Array 
        (
         [visits] => 300 
        ) 

      ) 

     [folderB] => Array 
      (
       [resource4] => Array 
        (
         [visits] => 400 
        ) 

      ) 

     [resource1] => Array 
      (
       [visits] => 100 
      ) 

    ) 

) 

C. Maintenant, cependant, je dois obtenir ce tableau dans la structure suivante (les enfants doivent être des tableaux non associatifs) qui est un vrai cerveau twister pour moi ...

Array 
(
[name] => www.example.com 
[isFolder] => 1 
[children] => Array 
    (
     [0] => Array 
      (
       [name] => folderA 
       [isFolder] => 1 
       [children] => Array 
        (
         [0] => Array 
          (
           [name] => resource2 
           [isFolder] => 0 
           [kpis] => Array 
            (
             [visits] => 200 
            ) 

           [children] => Array 
            (
            ) 

          ) 

         [1] => Array 
          (
           [name] => resource3 
           [isFolder] => 0 
           [kpis] => Array 
            (
             [visits] => 300 
            ) 

           [children] => Array 
            (
            ) 

          ) 

        ) 

      ) 

     [1] => Array 
      (
       [name] => folderB 
       [isFolder] => 1 
       [children] => Array 
        (
         [0] => Array 
          (
           [name] => resource4 
           [isFolder] => 0 
           [kpis] => Array 
            (
             [visits] => 400 
            ) 

           [children] => Array 
            (
            ) 

          ) 

        ) 

      ) 

     [2] => Array 
      (
       [name] => resource1 
       [isFolder] => 0 
       [kpis] => Array 
        (
         [visits] => 100 
        ) 

       [children] => Array 
        (
        ) 

      ) 

    ) 

) 

peut-elle aider quelqu'un avec une approche comment y parvenir? Soit en transformant le tableau de l'étape B. ou en partant de zéro avec les URL originales de l'étape A ... Toute aide est grandement apprécié! Merci beaucoup!

Répondre

0

Voici une petite fonction qui fera exactement ce que vous voulez. Il utilise une référence qui est déplacée dans l'arborescence et ajoute des données au tableau référencé par cette référence si nécessaire.

J'espère que les commentaires donnent suffisamment d'explications sur ce que fait le code.

$sourceArray = [ 
    'www.example.com' => 0, 
    'www.example.com/resource1' => 100, 
    'www.example.com/folderA/resource2' => 200, 
    'www.example.com/folderA/resource3' => 300, 
    'www.example.com/folderB/resource4' => 400, 
]; 

function convertToStructure($sourceArray) 
{ 
    // Initialize the tree 
    $tree = [ 
     'name' => 'root', 
     'isFolder' => 1, 
     'children' => [], 
    ]; 

    // Do nothing if sourceArray is not an array 
    if(!is_array($sourceArray)){ 
     return $tree; 
    } 

    // Loop through the source array 
    foreach($sourceArray as $path => $visits){ 
     // Get a reference to the target tree 
     $treeReference = &$tree; 

     // Split the path into pieces 
     $path = explode('/', $path); 

     // For each piece: 
     foreach($path as $key => $name){ 
      // Get the childKey if the child already exists 
      $childKey = findChild($treeReference, $name); 

      // Create a new child otherwise 
      if ($childKey === false) { 
       $treeReference['children'][] = [ 
        'name' => $name, 
        'isFolder' => 0, 
        'children' => [], 
       ]; 

       // Get the key of the new child item 
       end($treeReference['children']); 
       $childKey = key($treeReference['children']); 
      } 

      // Change the reference to the correct child item. 
      $treeReference = &$treeReference['children'][$childKey]; 

      // Set isFolder if necessary 
      $isFolder = ($key == count($path) - 1 ? 0 : 1); 
      if(!empty($isFolder)){ 
       $treeReference['isFolder'] = $isFolder; 
      } 

      // Set visits if necessary 
      if(!empty($visits)){ 
       $treeReference['isFolder'] = ['kpis' => ['visits' => $visits]]; 
      } 
     } 
    } 

    return $tree; 
} 

function findChild($tree, $name) 
{ 
    if(empty($tree['children'])){ 
     return false; 
    } 

    foreach($tree['children'] as $key => $child){ 
     if($child['name'] == $name){ 
      return $key; 
     } 
    } 
    return false; 
} 

$treeStructure = convertToStructure($sourceArray); 
+0

Très agréable - fonctionne comme un charme! Merci beaucoup pour cet exemple qualifié et fonctionnel! – SiarAneas