2015-09-25 72 views
2

有沒有一種乾淨的方式來有條件地結合2個PHP陣列? 我從兩個陣列以下JSON-響應分開:有條件地結合PHP陣列

1個數組:

[ 
     { 
     "field": { 
      "id": 20, 
      "name": "Erfolge", 
      "field-id": "erfolge", 
      "type": "textarea" 
     } 
     }, 
     { 
     "field": { 
      "id": 29, 
      "name": "Sprachen", 
      "field-id": "sprachen", 
      "type": "text" 
     } 
     } 
] 

第二陣:

[ 
    { 
    "field": { 
     "id": 20, 
     "name": "Erfolge", 
     "field-id": "erfolge", 
     "type": "textarea" 
    }, 
    "value": "new entry" 
    }, 
    { 
    "field": { 
     "id": 4, 
     "name": "Trikotnummer", 
     "field-id": "trikotnummer", 
     "type": "number" 
    }, 
    "value": "test" 
    }, 
    { 
    "field": { 
     "id": 29, 
     "name": "Sprachen", 
     "field-id": "sprachen", 
     "type": "text" 
    }, 
    "value": "Text" 
    } 
] 

我想下面的目標輸出:

[ 
     { 
     "field": { 
      "id": 20, 
      "name": "Erfolge", 
      "field-id": "erfolge", 
      "type": "textarea" 
     }, 
     value: "new entry" 
     }, 
     { 
     "field": { 
      "id": 29, 
      "name": "Sprachen", 
      "field-id": "sprachen", 
      "type": "text" 
     }, 
     value: "Text" 
     } 
] 

這意味着只有當字段存在於第一個數組中時,它才能添加值。 我目前的解決方案給了我沒有正確映射的所有字段:

$fieldData = array(); 
    foreach ($fields as $field) { 
     $fieldData[]['fields'] = $field->getArrayCopy(); 
    } 

    // Get Values 
    $values = $user->getProfileFieldValue(); 

    $fieldValue = array(); 
    foreach ($values as $value) { 
     $fieldValue[] = $value->getArrayCopy(); 
    } 

    $result = array_merge($fieldData, $fieldValue); 

我應該使用功能array_walk?

回答

4

這是一個昂貴的方法,它會搜索第二個數組,查找與第一個數組中的ID匹配的元素。

$result = array(); 
foreach ($first as $e1) { 
    $id = $e1['field']['id']; 
    foreach ($secondArray as $e2) { 
     if ($e2['field']['id'] == $id) { 
      $e1['value'] = $e2['value']; 
      break; 
     } 
    } 
    $result[] = $e1; 
} 

如果所述第二陣列是非常大的,則可以通過首先創建一個關聯數組,其關鍵是從所述第二陣列的ID和值的值進行優化。

+0

你錯過了'1'這裏:'$ ID = $ E1 [ '場'] [ '身份證'];' – Jeff

+0

雖然你的解決方案是昂貴的,我會用這個迭代。謝謝。 –

2

https://secure.php.net/manual/en/function.array-uintersect.php

$res = array_uintersect($arr1, $arr2, function($a, $b){ 
    return $a['field']['id'] - $b['field']['id']; 
}); 
+0

好的答案,OP只需要交換$ arr1和$ arr2來獲得所需的結果('array_uintersect($ arr2,$ arr1,...') – Danijel

+0

@Danijel重新考慮了我以前的評論。參數的順序是不重要的,但是一旦你得到3個或更多的數組,你需要記住,你的比較基礎必須始終是第一個。 – Sammitch

+0

@Sammitch:我怎樣才能將值添加到新的數組?謝謝。 –