Reorganisatie van een array met de 'id' -index van geneste arrays

Ik heb een array die er zo uitziet:

Array([0]=>Array([id]=>7 [name]=foo) [1]=>Array([id]=>10 [name]=bar) [2]=>Array([id]=>15 [name]=baz))

Elke index bevat een andere array met verschillende elementen, waaronder een 'id'. Ik wil een niveau "omhoog gaan", zodat mijn array op het hoogste niveau wordt geïndexeerd door het ID-element van de overeenkomstige geneste arrays, maar die index bevat nog steeds een array met alle elementen die zich in de submatrices bevonden?

Met andere woorden, hoe kan ik PHP gebruiken om de bovenstaande array in dit te veranderen:

Array([7]=>Array([id]=>7 [name]=foo) [10]=>Array([id]=>10 [name]=bar) [15]=>Array([id]=>15 [name]=baz))
0

2 antwoord

Wat je hier moet doen, is de ids uit elke subarray in je invoer uitpakken. Als u deze hebt als een array van ID's, bent u slechts een array_combine wegroepen van het opnieuw indexeren van uw oorspronkelijke array om deze id's als de sleutels te gebruiken.

Je kunt zo'n array van id's maken met array_map , wat leidt tot:

// input data
$array = array(array('id' => '7', 'name' => 'foo'),array('id' => 10, 'name' => 'bar'));

// extract ids from the input array
$ids = array_map(function($arr) { return $arr['id']; }, $array);

// "reindex" original array using ids as array keys, keep original values
$result = array_combine($ids, $array);

print_r($result);

The syntax I 've used for the anonymous function (first argument to array_map) requires PHP >= 5.3, but you can achieve the same (although a bit less conveniently) with create_function in any PHP version you 'd not be ashamed of using.

See it in action.

3
toegevoegd
Leuk antwoord en duidelijke opmerkingen Jon +1
toegevoegd de auteur alex, de bron

Probeer dit:

 $newArray = array();
 foreach($oldArray as $key => $value) {
    $newArray[$value['id']] = $value;
 }
1
toegevoegd
+1 voor het "low-tech" alternatief, wat altijd goed is om in gedachten te houden.
toegevoegd de auteur Jon, de bron