2016-12-28 166 views
-2

我有以下數組。從數組創建數組

{#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" 
    } 
    ] 
} 

我想它轉換喜歡跟着

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

我會做同樣的操作了無數時間,所以我認爲應該有一個適當的解決方案,而隨後循環的所有值,並如果其他檢查出ATTRIBUTE_NAME等

+1

'array_column()'就足夠了。 – mario

+0

您需要遍歷所有項目以將其全部轉換。不管這是你寫的循環,還是使用array_map https://secure.php.net/manual/en/function.array-map.php,你仍然需要觸摸每個項目。解決方案將至少O(n) – easement

+0

我不明白你的數組符號。什麼是「#11950」,屬性名稱前面的「+」是什麼意思? – Barmar

回答

3

你可以這樣做與單個呼叫到array_column,通過使用$index_key參數:

$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'); 

https://eval.in/705641參見

0

你可以做一個簡單的foreach循環和構建結果數組:)

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

這讀起來好一點。它可能不會使在大多數情況下太大的不同,但我不認爲這只是一個簡單的foreach爲高性能;)

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

哦,@Fyntasia打敗了我的替代版本^^ – martindilling

0

短暫而簡單:

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