2014-09-03 104 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));