2015-12-10 2 views
0

UPDATEvar_export версия массива HEREГруппировка многомерных массивов в PHP с помощью поля

У меня есть следующий массив, который я хотел бы сгруппировать элементы/детей по их стоимости Унилевел:

array( 
    0 => array(
     "member_id" => 3, 
     "unilevel" => 1, 
     "children" => array( 
      0 => array( 
       "member_id" => 4, 
       "unilevel" => 2, 
       "children" => array( 
        0 => array( 
         "member_id" => 6, 
         "unilevel" => 3, 
         "children" => array( 
          0 => array(
           "member_id" => 7, 
           "unilevel" => 4))))) 
      1 => array( 
       "member_id" => 9 
       "unilevel" => 2))) 
    1 => array( 
     "member_id" => 5, 
     "unilevel" => 1, 
     "children" => array( 
      0 => array( 
       "member_id" => 8, 
       "unilevel" => 2, 
       "children" => array( 
        0 => array( 
         "member_id" => 10, 
         "unilevel" => 3)))))) 

Контроллер ниже имеет функцию с именем: groupPerlevel, которая выполняет группировку, но теперь она группирует только первого родителя прямо сейчас, это уже рекурсивная функция, я не уверен, почему она не помещает элементы второго родителя в группы unilevel.

class TestController extends Controller { 
    private $group = array(); 

    private function setGroup($value) { 
     $this->group = $this->group + $value; 
    } 

    private function getGroup() { 
     return $this->group; 
    } 

    public function create() 
    { 
     $this->groupPerlevel($tree); 
     dd($this->getGroup()); 
    } 

    private function groupPerlevel(array $items) 
    { 
     var_dump($items); 
     $grouparr = $this->getGroup(); 

     $newkey = 0; 
     $templevel = 1; 

     foreach($items as $key => $val) { 
      if($templevel == $val->unilevel) { 
       $grouparr[$templevel][$newkey] = $val; 
       $this->setGroup($grouparr); 
      } else { 
       if(isset($grouparr[$val->unilevel][$newkey])) { 
        $count = count($grouparr[$val->unilevel]); 
        $grouparr[$val->unilevel][$count] = $val; 
        $this->setGroup($grouparr); 
       } else { 
        $grouparr[$val->unilevel][$newkey] = $val; 
       } 
      } 

      if(isset($val->children)) { 
       $children = $val->children; 
       unset($val->children); 
       $this->groupPerlevel($children); 
      } 
      $newkey++; 
     } 
     $this->setGroup($grouparr); 
    } 
} 

Следующий массив будет моим желаемым выходом. массив (4) {[1] - это UNILEVEL (группа), поэтому все элементы/дети должны быть в их собственной группе униселевых классов, основываясь на их значении поля в униливе. Но он делает это только для первого родителя, второй родитель не группируется.

array(
1 => array( 
    0 => array( 
     "member_id" => 3, 
     "unilevel" => 1)) 
4 => array( 
    0 => array( 
     "member_id" => 7, 
     "unilevel" => 4)) 
3 => array( 
    0 => array ( 
     "member_id" => 6, 
     "unilevel" => 3)) 
2 => array( 
    0 => array( 
     "member_id" => 4, 
     "unilevel" => 2 
    1 => array( 
     "member_id" => 9 
     "unilevel" => 2))) 
+0

Вы могли бы построить массив из него и опубликовать здесь ?, У меня проблема с созданием массива из вашего значения print_r –

+0

@SugumarVenkatesan, который на самом деле тот же массив, только с двумя полями, я пропустил другие поля, поскольку он слишком длинный – shifter

+0

Нет, на самом деле я хочу, если я его скопирую без любые изменения, которые он должен работать в моей системе. поэтому я могу легко попробовать результат, возможно ли это? –

ответ

0

Извините за поздний ответ попробовать этот

$arr=array("shiva" => array("member_id" => "3","unilevel" => "1","children" => array("0" => array("member_id" => "4","unilevel" => "2","children" => array("0" => array("member_id" => "6", "unilevel" => "3", "children" => array("0" => array("member_id" => "7", "unilevel" => "4"))))), "1" => array("member_id" => "9", "unilevel" => "2"))),"1" => array("member_id" => "5","unilevel" => "1","children" => array("0" => array("member_id" => "8","unilevel" => "2", "children" => array("0" => array("member_id" => "10", "unilevel" => "3")))))); 


function check($arr){ 

     if(is_array($arr)){ 

     foreach($arr as $arr1){ 

     foreach($arr1 as $arr2){ 

      if(is_array($arr2)){ 

      return true;    

      } 

     } 

     } 

    } 
    else{ 

     return false;  

    } 

     return false; 

    } 

$i=0; 
while(check($arr)){ 

    foreach($arr as $arr1key=>$arr1val){ 

    foreach($arr1val as $arr2key=>$arr2val){ 

     if(is_array($arr2val)){ 

     $arr[]=$arr[$arr1key][$arr2key]; 

     unset($arr[$arr1key][$arr2key]); 


     }   

    }  


    } 

} 






foreach($arr as $arr1key=>$arr1val) 
{ 

    if(count($arr1val)==0){ 
    unset($arr[$arr1key]); 
    }  
} 

//print_r($arr); 

$result=array(); 
$values=array(); 


foreach($arr as $arr1key=>$arr1val) 
{ 

    if(((array_key_exists("unilevel", $arr1val)) || (array_key_exists("member_id", $arr1val)))==true) 
    { 


     $key=$arr1val['unilevel']; 
     $result[0][$key][]=array("unilevel"=>$arr1val["unilevel"],"member_id"=>$arr1val["member_id"]); 


    } 


} 

print_r($result); 

Результат:

Array ([0] => Array ([1] => Array ([0] => Array ([ unilevel] => 1 [member_id] => 3) [1] => Array ([unilevel] => 1 [member_id] => 5)) [2] => Array ([0] => Array ([unilevel] => 2 [member_id] => 4) [1] => Array ([unilevel] => 2 [member_id] => 9) [2] => Array ([unilevel] => 2 [member_id] => 8)) [3] => Массив ([0] => Массив ([unilevel] => 3 [member_id] => 6) [1] => Массив ([unilevel] => 3 [member_ id] => 10)) [4] => Массив ([0] => Массив ([unilevel] => 4 [member_id] => 7))))

Смежные вопросы