2010-11-18 6 views
0

Si d'une fonction, je suis retourné un tableau multidimensionnel comme celui-ci ..Conversion d'un tableau multidimensionnel en une seule dimension un

array(0 => array('a' => 5), 1 => array('a' => 8)) 

Mais je vraiment besoin le contenu de la clé « a » ce qui est le meilleur chemin pour moi de convertir.

actuel, je suis en train de faire quelque chose comme ..

$new_array = array(); 

foreach ($multi_array AS $row) { 
    $new_array[] = $row['a'] 
} 
+0

De quel 'avez-vous besoin? La fusion des deux tableaux écrase l'index a avec le dernier tableau analysé. Pourriez-vous donner un exemple de ce que vous vouliez que la fonction retourne? –

+0

J'aurais besoin d'eux tous les deux, mais en tant que tableau unidimensionnel. – Toby

+0

Cela devrait être bien ... y at-il un problème avec le code, erreur ou autre? Il serait utile que vous nous montriez votre état final désiré. –

Répondre

2

Si c'est tous vos besoins sont, je pense que c'est la meilleure façon. Tout le reste aura le même traitement. Même après avoir examiné les fonctions du tableau, je dirais que ce serait la meilleure façon. Vous pouvez cependant faire une fonction pour le rendre un peu plus polyvalent:

$array = array(0 => array('a' => 1), 1 => array('a' => 8)); 

$new_array = flatten($array, 'a');  

function flatten($array, $index='a') { 
    $return = array(); 

    if (is_array($array)) { 
     foreach ($array as $row) { 
      $return[] = $row[$index]; 
     } 
    } 

    return $return; 
} 

Mais oui, je dirais que ce que vous avez serait le moyen le plus efficace de le faire.

+0

Cheers, tous les le temps que je le fasse je pense que je devrais faire une fonction mais ne jamais y arriver! – Toby

+0

Pour être honnête, la seule raison d'en faire une fonction est si vous prévoyez d'utiliser cette fonctionnalité à plus d'un endroit. IE pour empêcher la duplication de code :) –

4

sans foreach:

$array = array(0 => array('a' => 1), 1 => array('a' => 8)); 

$new_array = array_reduce($array, function ($result, $current) {$result[]=current($current); return $result;}, array()); 
0

Vous pouvez essayer Comme Comme la suite ......

$multi_array = array(0 => array('a' => 5), 1 => array('a' => 8)); 
    $new_array = array(); 

    foreach ($multi_array AS $key => $value) { 
     $new_array[] = $value['a']; 
    } 
0

Je me suis récemment trouvé face à ce problème, et je crois avoir trouvé la solution. Je reviendrai sur le problème lui-même, et aussi la solution, en essayant d'expliquer tout le long du chemin. Le problème était que je n'avais pas de tableau à deux dimensions, mais un tableau qui pouvait avoir un nombre quelconque de tableaux à l'intérieur des tableaux, donc la solution de Brad F Jacobs ne pouvait pas s'appliquer ici, bien que ce soit très simple et fonctionnel.

Je devais travailler avec une table de base de données auto-référencée appelée 'page Web', où l'une des colonnes était 'parentWebpageId', qui faisait référence à un Id d'une autre ligne dans cette même table. De cette façon, une structure en arbre peut être construite et facilement gérée, si vous obtenez vos boucles correctement. J'ai facilement créé une fonction qui est censée générer un tableau multidimensionnel à partir d'un tableau d'auto-référencement unidimensionnel, mais le problème est survenu lorsque j'ai essayé de faire une fonction qui devrait être contraire. J'avais besoin de cela parce que si je voulais supprimer une certaine page Web, tous ses enfants devraient également être supprimés, afin de préserver l'intégrité autoréférentielle.

Il était facile de générer un arbre dont la racine était la page qui devait initialement être supprimée, mais j'avais besoin d'une liste des ID de toutes les pages web de l'enfant, afin de les supprimer toutes.

Ainsi, la structure que j'avais été quelque chose comme ceci:

webpage1 
    id 
    title 
    ... 
    childWebpageArray 
webpage2 
    id 
    title 
    ... 
    childWebpageArray 
     webpage2.1 
      id 
      url 
      ... 
      childWebpageArray 
     webpage2.2 
      id 
      url 
      ... 
      childWebpageArray 
       webpage2.2.1 
        id 
        url 
        ... 
        childWebpageArray 
       webpage2.2.2 
        id 
        url 
        ... 
        childWebpageArray 
     webpage2.3 
      id 
      url 
      ... 
      childWebpageArray 
webpage3 
    id 
    title 
    ... 
    childWebpageArray 

Comme vous pouvez le voir, la profondeur peut aller pour toujours.

Ce que je suis venu avec est la suivante:

function flattenMultidimensionalArray($multidimensionalArray) { 

    // Set anchor. 
    ohBoyHereWeGoAgain: 

    // Loop through the array. 
    foreach ($multidimensionalArray as $key1 => $value1) { 

     // Check if the webpage has child webpages. 
     if (isset($multidimensionalArray[$key1]["childWebpageArray"]) && (count($multidimensionalArray[$key1]["childWebpageArray"]) > 0)) { 

      // If it does, loop through all the child webpages, and move them into the initial multi-dimensional array. 
      foreach ($multidimensionalArray[$key1]["childWebpageArray"] as $key2 => $value2) { 
       $multidimensionalArray[] = $multidimensionalArray[$key1]["childWebpageArray"][$key2]; 
      } 

      // Unset element's child pages, because all those child pages, along with their child pages 
      // have been moved into the initial array, thus reducing the depth of a multi-dimensional array by 1. 
      unset($multidimensionalArray[$key1]["childWebpageArray"]); 
     } 
    } 

    // Loop once again through the whole initial array, in order to check if any of the pages has children 
    foreach ($multidimensionalArray as $key => $value) { 

     // If a page which has children is found, kick the script back to the beginning, and go through it again. 
     if (isset($multidimensionalArray[$key]["childWebpageArray"]) && (count($multidimensionalArray[$key]["childWebpageArray"]) > 0)) { 
      goto ohBoyHereWeGoAgain; 
     } 
    } 

    // In the end, when there are no more pages with children, return an array of pages. 
    return $multidimensionalArray; 

} 

Cette solution a fonctionné dans mon cas, et je crois est la bonne pour ce genre de problème. Il n'est probablement pas très compliqué de le changer pour répondre à vos besoins particuliers.

Espérons que cela aide!

Questions connexes