2010-03-10 10 views
1

J'ai deux tableaux:Combiner deux tableaux sur une clé

$course = Array ([6] => 24 [0] => 20 [1] => 14) // etc 

Avec la clé étant le lien à l'autre tableau:

Array ( 
[0] => Array ([course_id] => 1 [course_name] => Appetizer) 
[1] => Array ([course_id] => 2 [course_name] => Breakfast) 
    ) //etc 

Je veux essentiellement ajouter la COURSE_NAME à la '1', 'Appetizer', '14' Désolé si je l'ai mal expliqué mais ses tableaux en retard et fusionnent mon cerveau en ce moment!

+0

Quelle version de php vous cherchez? 5.3? –

+0

ouais Im en utilisant le dernier et le plus grand – bluedaniel

Répondre

1

fermetures de 5.3 combinées avec les différentes fonctions d'itération de tableau natives font dans un processus assez indolore:

<?php 

// where $key is a course_id and $value is the associated course's next course 
$nextCourse = array(6 => 24, 0 => 20, 1 => 14); 

// course definitions 
$courses = array(
     0 => array("course_id" => 1, "course_name" => 'Appetizer'), 
     1 => array("course_id" => 2, "course_name" => 'Breakfast') 
); 

// loop through and add a next_course reference if one exists in $nextCourse map 
foreach($courses as &$course) { 
     if (isset($nextCourse[$course["course_id"]])) { 
       $course["next_course"] = $nextCourse[$course["course_id"]]; 
     } 
} 
// $courses is now the same as the var dump at the end 

/** 
* A bit of 5.3 proselytism with native array functions and closures, which is 
* an overly complex answer for this particular question, but a powerful pattern. 
* 
* Here we're going to iterate through the courses array by reference and 
* make use of a closure to add the next course value, if it exists 
* 
* array_walk iterates over the $courses array, passing each entry in 
* the array as $course into the enclosed function. The parameter is 
* marked as pass-by-reference, so you'll get the modifiable array instead 
* of just a copy (a la pass-by-value). The enclosure function requires 
* the 'use' keyword for bringing external variables in to scope. 
*/ 
array_walk($courses, function(&$course) use ($nextCourse) { 
     /** 
     * We check to see if the current $course's course_id is a key in the 
     * nextCourse link mapping, and if it is we take the link mapping 
     * value and store it with $course as its next_course 
     */ 
     if (isset($nextCourse[$course["course_id"]])) { 
       $course["next_course"] = $nextCourse[$course["course_id"]]; 
     } 
}); 

var_dump($courses); 

/** 
Output: 

array(2) { 
    [0]=> 
    array(3) { 
    ["course_id"]=> 
    int(1) 
    ["course_name"]=> 
    string(9) "Appetizer" 
    ["next_course"]=> 
    int(14) 
    } 
    [1]=> 
    array(2) { 
    ["course_id"]=> 
    int(2) 
    ["course_name"]=> 
    string(9) "Breakfast" 
    } 
} 
*/ 
+0

Stupéfait! Je suis vraiment confus quant à la façon dont il le fait bien! Pouvez-vous ajouter des commentaires étape par étape pour moi s'il vous plaît? Merci beaucoup! et ici je m'attendais à une réponse d'une ligne! – bluedaniel

+0

J'ai ajouté quelques commentaires, mais j'ai eu le marteau javascript dans ma main quand j'ai vu votre question passer et vous a donné une réponse trop complexe pour ce que vous essayez de faire. Si votre tableau $ courses a été indexé par le cours_id au lieu de numériquement, vous pouvez aussi faire un seul doublage combinant quelques appels aux autres fonctions de tableau natives, mais la boucle foreach est beaucoup plus facile à maintenir à long terme pour sa simplicité de lecture. –