2013-06-21 1 views
0

읽기 전용 다차원 연관 배열이 있습니다. 특정 값을 추출하여 일부 값으로 출력을 생성해야합니다.PHP를 사용하여 다차원 배열에 특정 키/값을 나열하십시오.

배열은 다음과 같다 :

array (
'Dogs' => 
array (
0 => 
array (
    'Name' => 'Big Dogs', 
    'ID' => '32', 
    'Brown dogs' => 
    array (
    0 => 
    array (
     'Name' => '4 legged dogs', 
     'Retrievers' => 
     array (
     0 => 
     array (
      'Name' => 'Fido', 
      'ID' => '11', 
      'Owner' => 'Billy', 
      'IsaBiter' => true, 
     ), 
    ), 
    ), 
    1 => 
    array (
     'Name' => '3 legged dogs', 
     'Retrievers' => 
     array (
     0 => 
     array (
      'Name' => 'Spot', 
      'ID' => '12', 
      'Owner' => 'Sally', 
      'IsaBiter' => false, 
     ), 
    ), 
    ), 

..

다음과 같이 어레이의 모든 값을 출력 할 수있는 배열을 실행 중첩 foreach 루프 :

echo "<ul>"; 
foreach($myArray as $arr1 => $val1) { 
    foreach($val1 as $arr2 => $val2) { 
    foreach($val2 as $val3) { 
    echo "<li>" . $val3 . "<ul>"; 
     foreach($val3 as $arr4 => $val4) { 
     foreach($val4 as $arr5 => $val5) { 
     echo "<li>" . $val5; 
     foreach($val5 as $arr6 => $val6) { 
     //echo $val6; 
       foreach($val6 as $arr7 => $val7) { 
      echo $val7 . "<br />"; //dumps the details 
        } 
        echo "</li>"; 
       } 
       }    
     } 
     echo "</ul>"; 
     echo "</li>"; 
     } 
    } 
} 

이상적으로 나는 쇼 (ID, 특정 배열 레벨 이름 등, 현재는 모두 표시) 및 2) 특정 이름 (예 : 이름, 소유자, IsaBiter)을 표시하지 않으려는 값을 제외 할 수 있기를 바랍니다. 다음과 같이 결과를 더 명확하게 포맷 할 수 있습니다.

Big Dogs 
    Brown Dogs 
    Retrievers 
     Name: Fido 
     Owner: Billy 
     IsaBiter: true 

     Name: Spot 
     Owner: Sally 
     IsaBiter: false 
+0

재귀를 사용해야합니다. –

+0

foreach ($ array AS $ key => $ value) {}를 사용하면 $ key를 보여주고 자하는 문자열과 비교할 수 있습니다. 어쨌든, 레벨을 필터링하는 것은 더 복잡 할 것입니다. 반복자 값 (정수 계산 레벨)을 포함하고 적절하게 제외해야합니다. 어쩌면, @WayneWhitty가 말했듯이, 재귀를 사용하는 것이 더 좋을 것입니다. –

+0

의견을 주셔서 감사합니다. – bridgemanusa

답변

1

다음은 원하는 결과에 가깝게 나타나는 재귀 함수의 시작입니다. 난 당신이 특정 수준 및 특정 키를 필터링 할 수 있습니다,하지만 당신은 아마 당신이 보여준 정확한 출력을 얻을 수보다 더 많은 일을해야하는 방법을 보여 주었다

function displayArray($array, $level = 0) { 
    // This filter determines which levels are displayed 
    $visible = in_array($level, array(0,2,4,6)); 

    if ($visible) { 
    echo '<ul>'; 
    foreach($array as $key => $value) { 
     if (is_array($value)) { 
     echo '<li>'; 
     echo $key; 
     displayArray($value, $level + 1); 
     echo '</li>'; 
     }      
     else { 
     // This filter determines which non-array keys are displayed 
     $visible = $level == 6 and in_array($key, array('Name','Owner','IsaBiter')); 

     if ($visible) { 
      if (is_bool($value)) $value = $value ? "true" : "false"; 
      echo '<li>'; 
      echo "$key : $value"; 
      echo '</li>'; 
     } 
     } 
    } 
    echo '</ul>'; 
    } 
    else { 
    // If a level is not visible, we still try and display child arrays 

    foreach($array as $key => $value) 
     if (is_array($value)) 
     displayArray($value, $level + 1); 
    }       
} 

.

첫 번째로, "Fido"와 "Spot"은 실제로 두 개의 별도 리트리버 배열 (다리가있는 리트리버 4 개와 다리가있는 리트리버 3 개)에서 가져온 것입니다. 의도적인지 확실하지 않습니다. 그렇다면 정확히 어떻게 규칙을 적용해야 할 지 잘 모르겠습니다.

둘째, 최상위 배열의 키인 것처럼 Big Dogs가 표시됩니다. 사실 그 배열에있는 항목의 하위 항목 중 하나의 "Name"값입니다. 다시 말하지만 의도적이라면 무엇을 표시하고 싶은지와 규칙을 결정할 때 어떤 규칙이 필요한지 정확하게 알 수는 없습니다.

이 답변으로 나머지를 직접 파악할 수 없다면 더 많은 샘플 데이터와 샘플 출력을 제공해야합니다. 그래서 나는 당신이 달성하고자하는 것을 정확하게 결정할 수 있습니다.

+0

감사합니다. James! 나는 오늘 이것을 시도 할 것이다. – bridgemanusa