2009-09-08 11 views
0

Si je voulais associer des éléments d'un tableau à un autre tableau par des valeurs identiques, par exemple. items.group_id -> groups.group_id, existe-t-il une fonction de tableau pour le faire proprement? =)Combine deux matrices sur une touche?

J'ai deux tableaux:

$items = array(
       [0] => array(
          'group_id' => 456, 
          'item_id' => 123, 
          // Rest of details 
        ); 
       [1] => array(
          'group_id' => 457, 
          'item_id' => 124, 
          // Rest of details 
        ); 
       [2] => array(
          'group_id' => 457, 
          'item_id' => 125, 
          // Rest of details 
        ); 
       [3] => array(
          'group_id' => 456, 
          'item_id' => 126, 
          // Rest of details 
        ); 
     ); 

$groups = array(
       [0] => array(
          'group_id' => 456, 
          'group_name' => 'General' 
        ); 
       [1] => array(
          'group_id' => 457, 
          'group_name' => 'Ungeneral' 
        ); 
     ); 

Et le résultat que je veux est:

$groups = array(
       [0] => array(
          'group_id' => 456, 
          'group_name' => 'General' 
          [0] => array(
            'item_id' => 123, 
            // Rest of details 
           ); 
          [1] => array(
            'item_id' => 126, 
            // Rest of details 
           ); 
        ); 
       [1] => array(
          'group_id' => 457, 
          'group_name' => 'Ungeneral' 
          [0] => array(
            'item_id' => 124, 
            // Rest of details 
           ); 
          [1] => array(
            'item_id' => 125, 
            // Rest of details 
           ); 
        ); 
     ); 

Il est sans doute pas trop compliqué, mais j'espérais qu'il y aurait une solution propre déjà mis en œuvre en PHP! Un grand merci pour toute aide.

Répondre

4

Je ne pense pas qu'il y ait une fonction intégrée pour ce faire, mais voici un code de base qui devrait gérer:

<?php 
    // First, group the items by their group_id 
    $items_by_group = array(); 
    foreach($items as $item) { 
     $items_by_group[$item['group_id']][] = $item; 
    } 

    // Second, go through the groups and if they have any associated items, 
    // add them to that group's array. 
    foreach($groups as $key => $value) { 
     if(isset($items_by_group[$value['group_id']])) { 
      foreach($items_by_group[$value['group_id']] as $ikey => $ivalue) { 
       unset($ivalue['group_id']); 
       $groups[$key][$ikey] = $ivalue; 
      } 
     } 
    } 
?> 

Notez que le code ci-dessus traite en toute sécurité les cas où vous avez des articles avec une identifiant de groupe invalide (un pour un groupe qui n'est pas défini - il ignorera ces éléments).

2

Il serait plus facile si vous KeyEd vos groupes tableau par l'identifiant au lieu des indices numériques

$newArray = array(); 
foreach($groups as $group) { 
    // add the group, and an items array we can append to later. 
    $newArray[$group['group_id']] = $group; 
    $newArray[$group['group_id']]['items'] = array(); 
} 
foreach ($items as $item) { 
    $newArray[$item['group_id']]['items'][] = $item; 
} 

devrait se traduire par un tableau comme celui-ci:

$newArray = array(
    [456] => array(
    'group_id' => 456, 
    'group_name' => 'General' 
    'items' => array(
     [0] => array(
     'item_id' => 123, 
     // Rest of details 
     ); 
     [1] => array(
     'item_id' => 126, 
     // Rest of details 
     ); 
     ); 
    ); 
0

J'ai trouvé une solution qui fonctionne pour moi, avec un peu d'aide de vos solutions chaps.

$links_by_group = array(); 
     foreach($links as $link) { 
      $linked_groups = $this->return_linked_groups($link['link_id']); 
      foreach($linked_groups as $group){ 
       $links_by_group[$group][$link['link_id']] = $link; 
      } 
     } 

Merci pour l'aide!

Questions connexes