如何在php中从现有数组生成嵌套数组

如何在php中从现有数组生成嵌套数组,php,arrays,Php,Arrays,我需要什么 我需要从现有阵列创建嵌套阵列 如果在数组中,两个值类型相同 根据他们的类型分组 like array[1]类型与array[2]类型相同,所以我需要将它们分组到单个嵌套数组中 这是数组结构 $data=$event['data']['pricing_detail']; [1] => Array ( [type] => Gene

我需要什么

  • 我需要从现有阵列创建嵌套阵列
  • 如果在数组中,两个值类型相同
  • 根据他们的类型分组
  • like array[1]类型与array[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";  

            }
        }
  • 我所面临的问题是我无法进行逻辑推理以得到预期的结果

您也创建了一个新的tickets数组,第一个维度是type的内容,第二个维度是它的原始id

大概是这样的:

$grouped = array();
foreach($data as $key => $value) {
    $grouped[$value['type']][$key] = $value;
    unset($grouped[$value['type']][$key]["type"]);
}
print_r($grouped);
foreach($grouped as $type => &$list)
    $list = multisort($list, 'comment', SORT_DESC);
根据您的数组结构进行调整,我看不到示例中$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);        
}

这样使用:

$grouped = array();
foreach($data as $key => $value) {
    $grouped[$value['type']][$key] = $value;
    unset($grouped[$value['type']][$key]["type"]);
}
print_r($grouped);
foreach($grouped as $type => &$list)
    $list = multisort($list, 'comment', SORT_DESC);

循环数组,存储类型及其所属的数组。 然后循环类型并添加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>';
结果:

[编辑]更新为
usort
,用于排序空的“评论”

[edit]
usort
中添加了一行,以防止在票证=0时进行不必要的排序


你能帮我解决如何根据数据结构对[comment]排序的问题吗?比如说,如果comment“string”应该在顶部,否则应该在ArraI的较低索引中。对不起,我不太清楚你需要什么,如果[comment]不是空的,那么它应该在顶部,否则如果[comment]如果是空的,我们应该将空评论放在较低的顺序。你是说如果评论是空的,你想切换它们吗?因此,结果数组变成
[0]=>数组([comment]=>'dadada',[amount]=>10)
[0]=>数组([amount]=>99,[comment]=>empty)
?是的,我只想根据empty/data对关联数组进行排序。如果comment在上面,您可以对comment进行排序吗?否则我们应该将空注释放在较低的位置