2016-12-28 4 views
-2

Ich habe folgende Array.Erstellen Array von Array

{#11950 
    +"attributes": array:3 [ 
    0 => {#608 
     +"attribute_value": "test123" 
     +"attribute_name": "name" 
    } 
    1 => {#556 
     +"attribute_value": "foo moo" 
     +"attribute_name": "lastname" 
    } 
    2 => {#605 
     +"attribute_value": "sample moo" 
     +"attribute_name": "email" 
    } 
    3 => {#606 
     +"attribute_value": "holo" 
     +"attribute_name": "adress" 
    } 
    ] 
} 

Ich möchte es konvertieren wie

folgen
$a = array(
    'name' => 'test123', 
    'lastname' => 'foo moo', 
    'email' => 'sample moo', 
    'address' => 'holo 
); 

ich unzählige Zeit gleiche Operation tun wird, so glaube ich, es eine richtige Lösung sein sollte, eher dann alle Werte Looping und attribute_name Auschecken mit, wenn sonst

usw.
+1

'array_column()' würde ausreichen. – mario

+0

Sie müssen alle Elemente durchlaufen, um sie alle zu konvertieren. Egal, ob Sie eine Schleife schreiben oder array_map https://secure.php.net/manual/en/function.array-map.php verwenden, Sie müssen immer noch jedes Element berühren. Lösung wäre mindestens O (n) – easement

+0

Ich verstehe Ihre Array-Notation nicht. Was ist '# 11950' und was bedeutet das' + 'vor den Eigenschaftsnamen? – Barmar

Antwort

3

Sie können dies tun mit einem einzigen Aufruf array_column, unter Verwendung des $index_key Parameter:

$arr = [ 
    ['attribute_name' => 'foo', 'attribute_value' => 123], 
    ['attribute_name' => 'bar', 'attribute_value' => 456], 
    ['attribute_name' => 'baz', 'attribute_value' => 789], 
]; 

$result = array_column($arr, 'attribute_value', 'attribute_name'); 

Siehe https://eval.in/705641

0

Sie könnten eine einfache foreach-Schleife tun und das Ergebnis Array bauen :)

$result = []; 
foreach ($array as $attr) { 
    $result[$attr['attribute_name']] = $attr['attribute_value']; 
} 

Das liest sich ein bisschen besser. Es ist wahrscheinlich nicht viel anders machen in den meisten Fällen, aber ich glaube nicht, dass es so performant ist, als nur eine einfache foreach;)

$result = array_combine(
    array_column($array, 'attribute_name'), 
    array_column($array, 'attribute_value') 
); 
+0

Oh, @Fyntasia schlug mich auf die alternative Version ^^ – martindilling

0

Kurz, aber einfach:

$result = array_combine(array_column($arr, 'attribute_name'), array_column($arr, 'attribute_value'));