2010-10-15 51 views
3

我有下一個數組:PHP數組結合

Array 
(
    [0] => Array 
     (
      [id] => 160 
      [payment_period] => Monthly 
      [plan_payment_type_id] => 171 
      [payment_type_id] => 4 
     ) 
    [1] => Array 
     (
      [id] => 160 
      [payment_period] => Monthly 
      [plan_payment_type_id] => 172 
      [payment_type_id] => 5 
     ) 
    [2] => Array 
     (
      [id] => 161 
      [payment_period] => Weekly 
      [plan_payment_type_id] => 173 
      [payment_type_id] => 9 
     ) 
) 

我需要這組由陣列ID。我怎樣才能以最好的方式做到這一點? 我的輸出應該是:

Array 
(
    [0] => Array 
     (
      [id] => 160 
      [payment_period] => Monthly 
      [payment_types] => Array(
       [0] => Array(
        [plan_payment_type_id] => 171 
        [payment_type_id] => 4 
       ) 
       [1] => Array(
        [plan_payment_type_id] => 172 
        [payment_type_id] => 5 
       ) 
      ) 
     ) 
    [1] => Array 
     (
      [id] => 161 
      [payment_period] => Weekly 
      [payment_types] => Array(
       [0] => Array(
        [plan_payment_type_id] => 173 
        [payment_type_id] => 9 
       ) 
      ) 
     ) 
) 

非常感謝。

+1

兩件事情:如果兩個元素具有相同的id但支付期不同,會發生什麼?也許你應該考慮在這種情況下拋開對象的數組?當你到達3D數組時,你的代碼可見性開始惡化。 – 2010-10-15 10:10:24

+0

如果'id'相同,除了'plan_payment_type_id'和'payment_type_id'外,其他元素也是一樣的。 – pltvs 2010-10-15 10:14:19

回答

3

事情是這樣的:

$output = array(); 
$id_array = array(); 
$i = 0; 
foreach($input as $key=>$val) { 
     if(array_key_exists($val['id'],$id_array)) { 
       $pos = $id_array[$val['id']]; 
       $output[$pos]['payment_types'][] = array('plan_payment_type_id'=> $val['plan_payment_type_id'],'payment_type_id' => $val['payment_type_id']); 
     } else { 
       $output[$i] = array('id' => $val['id'],'payment_period' => $val['payment_period'],'payment_types' => array(array('plan_payment_type_id'=> $val['plan_payment_type_id'],'payment_type_id' => $val['payment_type_id']))); 
       echo "Adding ",$val['id'],"\n"; 
       $id_array[$val['id']] = $i; 
       $i++; 
     } 
} 

Working link

1

你被卡住,因爲你試圖建立一個enumarated陣列,當你真正想這組由陣列ID。只需使用「ID」字段作爲目標指數:

foreach ($in as $src) { 
    extract($src); 
    $output[$id]["id"] = $id; 
    $output[$id]["payment_period"] = $payment_period; 
    $output[$id]["payment_types"][] = array(
     "plan_payment_type_id" => $plan_payment_type_id, 
     "payment_type_id" => $payment_type_id, 
    ); 
} 

當然你也可以用冗長的$ SRC []變量名,而不是邪惡的提取物()的快捷方式。

無論如何,這種方法將您的輸出數組按照$ id分組,但也保留「id」=> $ id內部鍵。