2014-09-03 106 views
1

我有此数组:排序阵列并重建

$all = array(
      'meat' => Object(
         'name' => 'meat', 
         'color' => 'red', 
         'class' => 'food' 
       ), 
      'chicken' => Object(
         'name' => 'chicken', 
         'color' => 'white', 
         'class' => 'food' 
       ), 
      'apple' => Object(
         'name' => 'apple', 
         'color' => 'green', 
         'class' => 'Fruit' 
       ), 
      'blueberry' => Object(
         'name' => 'blueberry', 
         'color' => 'blue', 
         'class' => 'Fruit' 
       ) 
    ); 

,我想对它进行排序,并重建它是这样的:

$theright = array(
       array(
        'class' => 'food', 
        'menu' => array(
           array(
            'name' => 'meat', 
            'color' => 'red', 
           ), 
           array(
            'name' => 'chicken', 
            'color' => 'white', 
           ) 

          ) 
        ), 
       array(
        'class' => 'Fruit', 
        'menu' => array(
           array(
            'name' => 'apple', 
            'color' => 'green', 
           ), 
           array(
            'name' => 'blueberry', 
            'color' => 'blue', 
           ) 
         ) 
        ) 
      ); 

我试图收集在$all阵列中的所有类然后比较每个值与$all阵列:

$classArray = array(); 
foreach($all as $key => $value) { 
    $classArray[$value->class] = array(); 
} 
foreach($classArray as $key => $value) { 
    $theright[] = array('class' => $key, 'menu' => array()); 
} 

此代码让我这个arr ay:

$theright = array(
       array(
        'class' => 'food', 
        'menu' => array() 
        ), 
       array(
        'class' => 'Fruit', 
        'menu' => array() 
        ) 
      ); 

我停在这里,怎么完成它?

+1

你只使用数组......你为什么要使用对象符号(' - >')在'foreach'循环? – 2014-09-03 08:00:43

+0

'$ all'包含对象。对不起,我编辑它 – 2014-09-03 08:25:07

+0

那些不是对象... – 2014-09-03 08:41:52

回答

1

您可以使用该类作为关键将它们组合在一起。例如:

$food = array(); 
// gather class 
foreach($all as $item) { 
    if(!isset($food[$item->class])) { 
     $food[$item->class] = array(
      'class' => $item->class, 
      'menu' => array(
       array(
        'name' => $item->name, 
        'color' => $item->name, 
       ) 
      ) 
     ); 
    } else { 
     $food[$item->class]['menu'][] = array('name' => $item->name,'color' => $item->color,); 
    } 
} 

// simple reindex 
$food = array_values($food); 
+0

非常好,但我需要'$食物'阵列没有钥匙 – 2014-09-03 08:40:02

+0

@AdamMo。你没有钥匙是什么意思?这就是为什么我在最后使用'array_values'来移除父数组上的这些密钥 – Ghost 2014-09-03 08:42:12

+0

哦对不起,我忘了它:D谢谢 – 2014-09-03 08:44:04

0

不需要第二个循环。这应该做你想做的。

$classMap = array(); 

foreach ($all as $item) 
{ 
    // check if class has been created in the class map 
    if (! array_key_exists($classMap, $item['class'])) 
    { 
     $classMap[$item['class']] = array(
      'class' => $item['class'], 
      'menu' => array() 
     ); 
    } 

    $classMap[$item['class']]['menu'][] = array(
     'name' => $item['name'], 
     'color' => $item['color'] 
    ); 
} 
0

尝试用更少的循环计数(2)

$all = []; 

function getSelectClassData(array &$all) 
{ 
    $finalArr = []; 

    while (count($all) > 1) { 
     $res    = []; 
     $class   = array_values($all)[0]->class; 
     $selectedDataArr = getSelectSimilerMenuData($all, $class); 
     $res['class'] = $class; 
     $res['menu']  = array_values($selectedDataArr); 
     $all    = array_diff_key($all,array_flip(array_keys($selectedDataArr))); 
     $finalArr[]  = $res; 
    } 

    return $finalArr; 
} 

function getSelectSimilerMenuData(array $all, $class) 
{ 
    return array_filter(
     $all, 
     function ($e) use ($class) { 
      return $e->class == $class; 
     } 
    ); 
} 

print_r(getSelectClassData($all));