2010-11-18 7 views
0

함수에서 나는 반환하고 경우 이와 같은 다차원 배열 ..는로 다차원 배열을 변환 한 차원 하나

array(0 => array('a' => 5), 1 => array('a' => 8)) 

하지만 정말 키의 내용이 필요합니다 '는이'가장 좋은 것입니다 나를 변환하는 방법. 내가 좋아하는 일을하고있다

현재 .. 그 경우

$new_array = array(); 

foreach ($multi_array AS $row) { 
    $new_array[] = $row['a'] 
} 
+0

'필요합니까? 두 배열을 병합하면 마지막 배열을 구문 분석하여 인덱스 a를 덮어 씁니다. 함수가 반환하기를 원하는 것을 보여줄 수 있습니까? –

+0

둘 다 필요하지만 단일 차원 배열로. – Toby

+0

괜찮을 것입니다 ... 코드, 오류 또는 이것 저것에 문제가 있습니까? 원하는 최종 상태를 보여 주면 도움이 될 것입니다. –

답변

2

내가 그 최선의 방법이라고 생각, 모든 요구 사항이 있습니다. 다른 것은 동일한 처리를 갖습니다. 배열 기능을 살펴본 후에도 이것이 최선의 방법이라고 말할 수 있습니다. 당신은, 그러나, 그것이 좀 더 다양한 만들 수있는 기능을 만들 수 있습니다

$array = array(0 => array('a' => 1), 1 => array('a' => 8)); 

$new_array = flatten($array, 'a');  

function flatten($array, $index='a') { 
    $return = array(); 

    if (is_array($array)) { 
     foreach ($array as $row) { 
      $return[] = $row[$index]; 
     } 
    } 

    return $return; 
} 

그러나 참으로, 나는 당신이 그 일을 가장 효율적인 방법이 될 것입니다 무엇을 말할 것입니다. foreach는없는

+0

건배 시간 나는 그것을한다 나는 나 자신에게 나는 그 기능을 만들어야한다고 생각하지만 결코 실제로 그것으로 돌아 가지 않는다! – Toby

+0

솔직히 말해서이 기능을 여러 곳에서 사용할 계획이라면 기능을 만드는 유일한 이유입니다. IE는 코드 중복을 방지하기 위해 :) –

4

는 :

$array = array(0 => array('a' => 1), 1 => array('a' => 8)); 

$new_array = array_reduce($array, function ($result, $current) {$result[]=current($current); return $result;}, array()); 
0

당신은 다음과 같은 시도 할 수 있습니다 ......

$multi_array = array(0 => array('a' => 5), 1 => array('a' => 8)); 
    $new_array = array(); 

    foreach ($multi_array AS $key => $value) { 
     $new_array[] = $value['a']; 
    } 
0

나는 최근 자신이이 문제에 직면하고, 나는 해결책을 발견 믿고 발견했다. 나는 그 문제 자체를 해결할 것이며 해결책을 찾아 모든 것을 설명하려고 노력할 것입니다.

문제는 2 차원 배열이 아니었지만 어레이 내부에 배열이 여러 개있는 배열 이었기 때문에 Brad F Jacobs의 솔루션은 여기에 적용 할 수 없었습니다. 매우 간단하고 기능의.

'webpage'라는 자체 참조 데이터베이스 테이블에서 작업해야했습니다.이 중 하나의 열은 'parentWebpageId'였으며, 동일한 테이블의 다른 행의 ID를 참조했습니다. 이렇게하면 루프를 올바르게 작성하면 트리 구조를 만들고 쉽게 관리 할 수 ​​있습니다.

1 차원 자기 참조 배열에서 다차원 배열을 생성해야하는 함수를 쉽게 만들었지 만 그 반대의 함수를 만들려고 할 때 문제가 발생했습니다. 특정 웹 페이지를 삭제하려면 자기 참조 무결성을 유지하기 위해 모든 웹 페이지를 삭제해야하기 때문에 필요했습니다.

루트가 처음 삭제 된 페이지 인 트리를 생성하기 쉽지만 모든 아이 웹 페이지의 ID 목록을 모두 삭제해야만 삭제할 수 있습니다. 당신이 볼 수 있듯이

webpage1 
    id 
    title 
    ... 
    childWebpageArray 
webpage2 
    id 
    title 
    ... 
    childWebpageArray 
     webpage2.1 
      id 
      url 
      ... 
      childWebpageArray 
     webpage2.2 
      id 
      url 
      ... 
      childWebpageArray 
       webpage2.2.1 
        id 
        url 
        ... 
        childWebpageArray 
       webpage2.2.2 
        id 
        url 
        ... 
        childWebpageArray 
     webpage2.3 
      id 
      url 
      ... 
      childWebpageArray 
webpage3 
    id 
    title 
    ... 
    childWebpageArray 

, 깊이가 영원히 갈 수 있습니다

그래서, 내가 가진 구조는 다음과 같이이었다.

function flattenMultidimensionalArray($multidimensionalArray) { 

    // Set anchor. 
    ohBoyHereWeGoAgain: 

    // Loop through the array. 
    foreach ($multidimensionalArray as $key1 => $value1) { 

     // Check if the webpage has child webpages. 
     if (isset($multidimensionalArray[$key1]["childWebpageArray"]) && (count($multidimensionalArray[$key1]["childWebpageArray"]) > 0)) { 

      // If it does, loop through all the child webpages, and move them into the initial multi-dimensional array. 
      foreach ($multidimensionalArray[$key1]["childWebpageArray"] as $key2 => $value2) { 
       $multidimensionalArray[] = $multidimensionalArray[$key1]["childWebpageArray"][$key2]; 
      } 

      // Unset element's child pages, because all those child pages, along with their child pages 
      // have been moved into the initial array, thus reducing the depth of a multi-dimensional array by 1. 
      unset($multidimensionalArray[$key1]["childWebpageArray"]); 
     } 
    } 

    // Loop once again through the whole initial array, in order to check if any of the pages has children 
    foreach ($multidimensionalArray as $key => $value) { 

     // If a page which has children is found, kick the script back to the beginning, and go through it again. 
     if (isset($multidimensionalArray[$key]["childWebpageArray"]) && (count($multidimensionalArray[$key]["childWebpageArray"]) > 0)) { 
      goto ohBoyHereWeGoAgain; 
     } 
    } 

    // In the end, when there are no more pages with children, return an array of pages. 
    return $multidimensionalArray; 

} 

이 솔루션은 내 경우에는 일을, 나는 이런 종류의 문제에 대한 올바른 일이라고 생각 : 내가 생각 해낸 무엇

이있다. 그것은 당신의 특별한 요구에 맞추기 위해 그것을 바꾸는 많은 번거 로움이 아닐 것입니다.

희망이 도움이됩니다.

관련 문제