如何在php中从现有数组中创建嵌套数组

时间:2014-10-14 12:51:07

标签: php arrays

我需要什么

  • 我需要从现有阵列创建嵌套数组。
  • 如果在数组中,两个值类型都相同。
  • 根据类型分组。
  • like array [1]类型是相同的数组[2]类型所以我需要将它们分组为单个嵌套数组。

这是数组结构

                  $data=$event['data']['pricing_detail'];
                  [1] => Array
                  (
                  [type] => General Public Tickets Adult
                  [amount] => 50
                  [comment] => (Working Days)
                  )

                  [2] => Array
                  (
                  [type] => General Public Tickets Adult
                  [amount] => 80
                  [comment] => (Saturday/ Sunday/ Holiday)
                  )
  • 我需要输出

                  [1] => Array
                  (
                    [type] => General Public Tickets Adult
                    [metadata]=>array
                       (
                           [0] =>array
                            (
                               [amount] => 50
                               [comment] => (Working Days)
                            )
                            [1]=>array
                             (
                              [amount] => 80
                              [comment] => (Saturday/ Sunday/ Holiday)
                             )
                      )
                   )
    

代码段

         $data=$event['data']['pricing_detail'];
         $metadata = array();
        foreach($data as $key => $value)
        {

                if($value[1]['type'] == $value[2]['type'])
            {

                $metadata[$key]['amount'] = $value['amount'];
                print_r($metadata);

            }
            else
            {
                  echo  "not matched";  

            }
        }
  • 我面临的问题是我无法制作逻辑以获得理想的结果。

2 个答案:

答案 0 :(得分:1)

您也创建了一个新的故障单数组,第一维是类型的内容,第二维是它的原始ID。

这样的事情:

$grouped = array();
foreach($data as $key => $value) {
    $grouped[$value['type']][$key] = $value;
    unset($grouped[$value['type']][$key]["type"]);
}
print_r($grouped);

根据您的数组结构进行调整,我无法看到您样本中$ data的实际结构。

<小时/> 如果要对多级数组进行排序,可以使用此函数的变体:

/**
 * sort an multidimensional array by any of it's fields and return sorted array
 * ex.: $sorted = multisort($data, 'volume', SORT_DESC, 'edition', SORT_ASC);
 * IMPORTANT: This function uses mutlisort and will reindex numeric keys !
 * @param array $data       array to sort
 * @param string $field     name of field to sort by
 * @param int $direction    SORT_DESC or SORT_ASC constant
 * @return array
 */
 function multisort(){
     $args = func_get_args();
     $data = array_shift($args);

     foreach ($args as $n => $field) {
         if (is_string($field)) {
             $tmp = array();
             foreach ($data as $key => $row)
                 $tmp[$key] = $row[$field];
             $args[$n] = $tmp;
         }
     }

     $args[] = &$data;
     call_user_func_array('array_multisort', $args);
     return array_pop($args);        

}

像这样使用:

foreach($grouped as $type => &$list)
    $list = multisort($list, 'comment', SORT_DESC);

答案 1 :(得分:1)

循环数组,存储它们所属的类型和数组。 然后循环类型并添加te值。

//store types and the arrays the belong to    
foreach($data as $k=>$v){
    $type[$v['type']][]=$k;
    }

//loop types, creating result array
foreach($type as $k=>$v){
    $tmp=array(
        'type'=>$k,
        'metadata'=>array()
        );
      //loop all the arrays of this type
    foreach($v as $w){
                //store in TMP
    $t=array(
        'amount' => $vals[$w]['amount'],
        'comment' => $vals[$w]['comment']
                     );
                //sort TMP on EMPTY value
    usort($t,function ($a, $b) {
        if($a == '' && $b != '') return 1;
        if($b == '' && $a != '') return -1;
        if($b == 0){return 1;}
        return 0; 
        });
    //store 
    $tmp['metadata'][]=$t;
          }
    $result[]=$tmp;
    }

echo '<pre>'.print_r($result,true).'<pre>';

示例:

$data=array(
    1 => Array(
        'type' => 'General Public Tickets Adult',
      'amount' => 50,
      'comment' => '(Working Days)'),
      2 => Array    (
       'type' => 'General Public Tickets Adult',
       'amount' => 80,
       'comment' => '(Saturday/ Sunday/ Holiday)'),
    3 => Array  (
       'type' => 'Special Tickets Children',
       'amount' => 300,
       'comment' => '(Saturday/ Sunday/ Holiday)'),
    4 => Array  (
       'type' => 'Special Tickets Children',
       'amount' => 10000,
       'comment' => '(Monday afternoon)')
);

结果:

Array
(
    [0] => Array(
            [type] => General Public Tickets Adult
            [metadata] => Array(
                    [0] => Array(
                            [amount] => 50
                            [comment] => (Working Days)
                        )
                    [1] => Array(
                            [amount] => 80
                            [comment] => (Saturday/ Sunday/ Holiday)
                        )
                )
        )

    [1] => Array(
            [type] => Special Tickets Children
            [metadata] => Array(
                    [0] => Array(
                            [amount] => 300
                            [comment] => (Saturday/ Sunday/ Holiday)
                        )
                    [1] => Array(
                            [amount] => 10000
                            [comment] => (Monday afternoon)
                        )
                )
        )
)
使用usort更新了

[edit] ,以便对空的“评论”进行排序;

[edit] usort添加了一行,以防止在故障单= 0时不必要的排序;

And a fiddle