2017-02-01 15 views
1

を作成します。私はnamecountryageでグループ同じidに必要PHP多次元配列:グループ繰り返される値と私はこのような繰り返しの値を持つ配列を持つ「サブアレイ」

Array 
(
    [0] => Array 
     (
      [id] => 112 
      [name] => John 
      [country] => Spain 
      [age] => 24 
      [company] => One 
      [price] => 10 
     ) 
    [1] => Array 
     (
      [id] => 112 
      [name] => John 
      [country] => Spain 
      [age] => 24 
      [company] => Two 
      [price] => 15 
     ) 
    [2] => Array 
     (
      [id] => 112 
      [name] => John 
      [country] => Spain 
      [age] => 24 
      [company] => Three 
      [price] => 20 
     ) 
    [3] => Array 
     (
      [id] => 224 
      [name] => Paul 
      [country] => France 
      [age] => 25 
      [company] => One 
      [price] => 25 
     ) 
    [4] => Array 
     (
      [id] => 224 
      [name] => Paul 
      [country] => France 
      [age] => 25 
      [company] => Two 
      [price] => 40 
     ) 
) 

、および「作ります

012:私は良い結果せずにこのコードを試してみました companyprice

Array 
(
    [112] => Array 
     (
      [id] => 112 
      [name] => John 
      [country] => Spain 
      [age] => 24 
      [companies] => array (
            array(
             [company] => One 
             [price] => 10 
           ) 
            array(
             [company] => Two 
             [price] => 15 
           ) 
            array(
             [company] => Three 
             [price] => 20 
           ) 
          )    
     ) 

    [224] => Array 
     (
      [id] => 2 
      [name] => Paul 
      [country] => France 
      [age] => 25 
      [companies] => array (
            array(
             [company] => One 
             [price] => 25 
           ) 
            array(
             [company] => Two 
             [price] => 40 
           ) 
          )    
     )   
) 

とサブアレイ」

$new_array = array(); 
foreach ($my_array as $item) {  
    $new_array[$item['id']][] = $item; 
    $new_array[$item['id']]['companies'][] = $item; 

} 

その後、私はこれを試してみました:

$new_array = array(); 
foreach ($my_array as $item) {  
    $new_array[$item['id']]['temp'] = $item; 
    $new_array[$item['id']]['companies'][] = $item;   
} 

が正常に動作しますが、私はそれを望んでいないことをtempキーを取得します。 $final_array[$key]['id']

:私はIDに正しくアクセスすることができ、このコードで

$final_array = array(); 
foreach ($new_array $key=>$item) {  
    $final_array [$key] = $item['temp']; 
    $final_array [$key]['temp'] = $item['companies']; 
} 

:たとえば、このコードで、私は別のループとtempキーを削除することができ$new_array [$key]['temp']['id']

id項目にアクセスする必要があります

別のオプションは、このコードです:

foreach($array as $v) { 
    $result[$v['id']]['id']   = $v['id']; 
    $result[$v['id']]['name']  = $v['name']; 
    $result[$v['id']]['country']  = $v['country']; 
    $result[$v['id']]['age']   = $v['age']; 
    $result[$v['id']]['companies'][] = array('company' => $v['company'], 
              'price' => $v['price']); 
} 

しかしワットあれば、それは非常にエレガントではありませんeにはもっと多くのキーがありました(電話、メール...)

アイデア?あなたが述べたように

答えて

1

何もが、ここでは、(複数のアレイ値に対してより寛容にする方法についていくつかのアイデアです、電話、電子メールなど)。

これは便利なPHP array_diff_key関数を使用して、「コア」レコードから不要な配列要素を削除します。次に、array_diff_keyを適用して、同じ配列要素を「会社」レコードに入れます。他の回答と同様に

// set up the array of keys you don't want in the "original" record 
$exclude = ['company' => FALSE, 'price' => FALSE]; 
// Your original loop 
foreach($array as $v) { 
    // not strictly necessary, but helps readability 
    $id = $v['id']; 
    // Assign the "core" record all the values you want, excluding those defined above 
    // in this case, will remove "company" and "price" 
    $record = array_diff_key($v, $exclude); 

    // only set this if not already set, otherwise wipes out previous companies 
    if (! isset($result[$id])) { 
     $result[$id] = $record; 
     $result[$id]['companies'] = []; 
    } 

    // strip off the OTHER values from the array you don't want stored with the company 
    // this will automatically pick up the field NOT excluded above 
    // in this case, will remove all BUT "company" and "price" 
    $company = array_diff_key($v, $record); 
    $result[$id]['companies'][] = $company; 
} 
+0

こんにちは、あなたはコードをテストしましたか?思考は非常に良いようだが、私は期待された結果を得ていない – kurtko

+0

このコードで私にはうまくいくようだ:$ exclude = array( 'company' => 0、 'price' => 0) – kurtko

+0

作品!!完璧な解決策 – kurtko

0

一つの方法ローマへ...あなたが端に設けられたコードが間違って

$collector=array(); 
foreach($array as $set){ 
//get a copy 
$ref = $set; 
//unset company data 
unset($ref['company'],$ref['price']); 
//make a refer 
$r=$ref['id']; 
//setup main data if not set before 
if(!isset($collector[$r])){ 
    $collector[$r]=$ref; 
} 
//collect company data 
$collector[$r]['companies'][] = array('company'=>$set['company'],'price'=>$set['price']); 
} 
print_r($collector); 
0

$info = array (
    array('id' => 112, 'name' => 'John', 'country' => 'Spain', 'age' => 24, 'company' => 'One', 'price' => 10), 
    array('id' => 112, 'name' => 'John', 'country' => 'Spain', 'age' => 24, 'company' => 'Two', 'price' => 15), 
    array('id' => 112, 'name' => 'John', 'country' => 'Spain', 'age' => 24, 'company' => 'Three', 'price' => 20), 
    array('id' => 224, 'name' => 'Paul', 'country' => 'France', 'age' => 25, 'company' => 'One', 'price' => 25), 
    array('id' => 224, 'name' => 'Paul', 'country' => 'France', 'age' => 25, 'company' => 'Two', 'price' => 40) 
); 

$grouped = array(); 
foreach ($info as $item) { 
    if (!isset($grouped[$item['id']])) { 
     $grouped[$item['id']] = $item; 
    } 
    $grouped[$item['id']]['companies'][] = array($item['company'],$item['price']); 
    unset($grouped[$item['id']]['company']); 
    unset($grouped[$item['id']]['price']); 
} 

print_r($grouped); 
+0

これは、「新しい分野に寛容である」という問題を解決しないということです。それが問題の全目的です。 –

+0

これはおそらくデータベースから来ているようです。その場合、idフィールドはフィールドの数に関係なくレコードを一意に識別しています。私のコードはそれに耐性があります。新しいフィールドを「会社」の下にグループ化する必要がある場合は、とにかくコードを変更する必要があります。グループ化が必要なフィールドを保持する別の配列を作成するだけでも簡単です。それを言って、私のコードは読んだり維持したりするのが複雑ではありません。 –

関連する問題