2011-09-29 3 views
0

배열 형식으로 제공된 데이터를 처리하는 몇 가지 기능이 있습니다. 이러한 함수는 모두 동일한 작업을 수행하므로 단일 함수로 병합하고 싶습니다.PHP에서 외부 배열 제거

문제는 각각 깊이가 다른 배열을 받는다는 것입니다. 1 차원, 2 차원 및 3 차원 배열이 사용되고 미래의 일부 구현에서는 4 차원 배열이 사용될 수도 있습니다.

어쨌든 중요하고 필요한 데이터는 항상 두 개의 가장 안쪽에있는 배열에 있으므로 가장 안쪽에있는 두 개의 레벨 만있을 때까지 외부 배열을 제거해야합니다. 의심의 여지가 단순히 그것을하는 방법이 아니라, 어떻게 우아하고 효율적으로 할 수있는, 내가 현재의 방법을 좀 서투른 찾으십시오.

현재 방법

function add() { 
    $data = func_get_args(); 
    if(count($data)>0) { 
     if(is_array($data[0])) { 
      if(is_array($data[0][0])) { 
       foreach($data[0] as $row) { 
        $this->items[] = $row; 
       } 
      } else { 
       $this->items[] = $data[0]; 
      } 
     } else { 
      $this->items[] = $data; 
     } 
    } 
} 

몇몇 사용 예 : 데이터 func_get_args 통해 회수 같이

$list->add('one', 'two', 'three', 'four', 'five'); 

$list->add($data_from_DB_in_array_format); 

$list->add(
    array(
     array('one', 'two', 'three', 'four', 'five'), 
     array('six', 'seven', 'eight', 'nine', 'ten') 
     ) 
    ); 

$list->add(
    array(
     array(
      array('one', 'two', 'three', 'four', 'five'), 
      array('six', 'seven', 'eight', 'nine', 'ten') 
      ) 
     ) 
    ); 

()는, 모두 간이 배열 안에 넣고.

결과는 다음과 같이해야합니다 :

array(
     array('one', 'two', 'three', 'four', 'five'), 
     array('six', 'seven', 'eight', 'nine', 'ten') 
     ); 
+0

현재 방법은 무엇입니까? –

+0

다양한 데이터 구조의 몇 가지 예를 제공하십시오 –

+0

한 인스턴스에서 데이터가 배열이 아니라 다양한 양의 요소가있는 목록으로 전달되기 때문에 func_get_args()가 필요합니다. –

답변

1

당신이 이것을 달성 할 수있는 유일한 방법이 있습니다, 그것은 recursiveness과 약간의 배열 함수 마법이다. 아마도 정확한 해결책은 아니지만 더 많은 도움이 필요하면 저에게 알려주세요.

<?php 

$data = array(
    'test1' => array(
     'test2' => array(
      'test3' => array(
       'test4' => array(
        1, 
        2, 
        3 
       ), 
       'test5' => array(
        4, 
        5, 
        6 
       ), 
       'test6' => array(
        7, 
        8, 
        9 
       ), 
      ) 
     ) 
    ) 

); 
function returnLast2Levels($item){ 
    if(is_array($item) && is_array(reset($item)) && is_array(reset(reset($item)))){ 
     //This $item has more than 2 levels, delve deeper 
     return returnLast2Levels(reset($item)); 
    }elseif(is_array($item) && is_array(reset($item)) && !is_array(reset(reset($item)))){ 
     //This $item has 2 levels deep of array 
     return $item; 
    } 
} 

var_dump(returnLast2Levels($data)); 
+0

완벽! 그게 바로 제가 찾고 있던 것이 었습니다! –