테스트 사이트 - 개발 중인 베타 버전입니다

php 배열 출력 채택완료

찬돌이 4년 전 조회 2,774

</p>

<p>$arr=array(

    "a"=>"aa",

    "b"=>"ba",

    "c"=>array("x","y","z"));

$arr_cnt = count(max(array_values($arr)));</p>

<p>echo "<table border=1>";

echo "<tr>";

foreach($arr as $key=>$val) {

    if(is_array($arr[$key])) {

        foreach($val as $key1=>$val1) {

            echo "<td> {$val1} </td>";

        }

    }else {

        echo "<td> {$val} </td>";

        for($i=0; $i<$arr_cnt-1; $i++) {

            echo "<td>0</td>";

        }

    }

    echo "</tr>";

}

echo "</table>";</p>

<p>

 

출력 결과는

aa | 0 | 0

ba | 0 | 0

x   | y | z

그런데......

 

</p>

<p>$arr2=array(

    "a"=>array("aa"),

    "b"=>array("ba","bb"),

    "c"=>array("x","y","z")

);

$arr2_cnt = count(max(array_values($arr2)));</p>

<p>echo "<table border=1>";

echo "<tr>";

foreach($arr2 as $key=>$val) {

    if(is_array($arr2[$key])) {

        foreach($val as $key1=>$val1) {

            echo "<td> {$val1} </td>";

        }

    }else {

        echo "<td> {$val} </td>";

        for($i=0; $i<$arr2_cnt-1; $i++) {

            echo "<td>0</td>";

        }

    }

    echo "</tr>";

}

echo "</table>";</p>

<p>

출력 결과는

aa | 

ba | bb 

x   | y | z

빈 자리 0이 사라진채 출력이 됩니다.

어디에 문제가 발생 한 것인가요?

배열 출력이 어렵네요......

댓글을 작성하려면 로그인이 필요합니다.

답변 6개

채택된 답변
+20 포인트
핑크빈
4년 전

 

</p>

<p><?php</p>

<p>$arr2=array(</p>

<p>    "a"=>array("aa"),</p>

<p>    "b"=>array("ba","bb"),</p>

<p>    "c"=>array("x","y","z")</p>

<p>);</p>

<p>$arr2_cnt = count(max(array_values($arr2)));</p>

<p>echo "<table border=1>";</p>

<p> </p>

<p>foreach($arr2 as $key => $value){</p>

<p>    echo "<tr>";</p>

<p>    for($s=0; $s<$arr2_cnt; $s++)</p>

<p>    {</p>

<p>        echo '<td>';</p>

<p>        echo (isset($arr2[$key][$s])) ? $arr2[$key][$s] : '0';</p>

<p>        echo '</td>';</p>

<p>    }</p>

<p>    echo '</tr>';</p>

<p>}</p>

<p>?></p>

<p>

 

두개의 조건다포함할경우

</p>

<p><?php</p>

<p>$arr2=array(</p>

<p>    "a"=>array("aa"),</p>

<p>    "b"=>"ba",</p>

<p>    "c"=>array("x","y","z"));</p>

<p> </p>

<p>$arr2_cnt = count(max(array_values($arr2)));</p>

<p>

 </p>

<p>echo "<table border=1>";</p>

<p> </p>

<p>foreach($arr2 as $key => $value){</p>

<p>    echo "<tr>";</p>

<p>    if(is_array($arr2[$key])){</p>

<p>    for($s=0; $s<$arr2_cnt; $s++)</p>

<p>    {</p>

<p>        echo '<td>';</p>

<p>        echo (isset($arr2[$key][$s])) ? $arr2[$key][$s] : '0';</p>

<p>        echo '</td>';</p>

<p>    }</p>

<p>}else{</p>

<p>    echo '<td>'.$value.'</td>';</p>

<p>    for($s=0; $s<$arr2_cnt-1; $s++)</p>

<p>    {</p>

<p>        echo '<td>0</td>';</p>

<p>    }</p>

<p>}</p>

<p>    echo '</tr>';</p>

<p>}</p>

<p>?></p>

<p>

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

4년 전

제가 연구하여 얻은 결과물 입니다.

</p>

<p>$arr=array(

    "a"=>array("aa"),

    "b"=>array("ba","bb"),

    "c"=>array("x","y","z")

);</p>

<p>$arr_cnt = count(max(array_values($arr)));

echo "<table border=1>";

foreach($arr as $key=>$val) {

    echo "<tr>";

    $arr2_cnt = count(array_values($val));

    foreach($val as $key1=>$val1) {

        echo "<td> {$val1} </td>";    

    }

    for($i=0; $i<$arr_cnt-$arr2_cnt; $i++) {

        echo "<td> 0 </td>";    

    }

    echo "</tr>";

}

echo "</table>";</p>

<p>

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

P
Phillips
4년 전

댓글을 작성하려면 로그인이 필요합니다.

둘째 코드는 else 부분이 필요가 없죠. 모두 array니까요.
    if(is_array($arr2[$key])) {
        foreach($val as $key1=>$val1) {
            echo "<td> {$val1} </td>";
        }
        //여기서 부족한 갯수<TD를 채워 주면 됩니다.
    }else {
        echo "<td> {$val} </td>";
        for($i=0; $i<$arr2_cnt-1; $i++) {
            echo "<td>0</td>";
        }
    }
로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

4년 전

첫번째 코드는 a, b키가 배열이 아니라서 else문의 for문을 최대요소숫자만큼 돌려 요소가 없는 경우

0이 찍힌 것이고,

두번째 코드는 a, b키 값이 배열이라서 else문이 아니라 if문을 통과하다 보니 0이 찍힐일이

없었던거죠.

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

$arr2_cnt = count(max(array_values($arr2)));

이게 이상하군요.

배열 길이의 최대를 구하고자 한 것이면

$max_cnt=0;

foreach( $arr2 as $aa) {

if( is_array( $aa) ) $tmp= count( $aa); else $aa=1;

if( $max_cnt < $aa) $max_cnt=$aa;

}

이렇게 해야 합니다.


 
로그인 후 평가할 수 있습니다

답변에 대한 댓글 3개

P
Phillips
4년 전
@엑스엠엘 다차원 배열에선 해당배열들의 최대길이를 구할떄 count(max(array_values($arr2))); 로도 가능합니다.
엑스엠엘
4년 전
@Phillips
그렇군요.
https://www.php.net/manual/en/function.max.php
Caution
Be careful when passing arguments of different types because max() can produce unpredictable results.

라고 되어 있어서 더 살펴 보니

// With multiple arrays of different lengths, max returns the longest
$val = max(array(2, 2, 2), array(1, 1, 1, 1)); // array(1, 1, 1, 1)

// Multiple arrays of the same length are compared from left to right
// so in our example: 2 == 2, but 5 > 4
$val = max(array(2, 4, 8), array(2, 5, 1)); // array(2, 5, 1)

// If both an array and non-array are given, the array will be returned
// as comparisons treat arrays as greater than any other value
$val = max('string', array(2, 5, 7), 42); // array(2, 5, 7)

이런 설명이 더 있네요.

array_values()는 필요가 없군요.
P
Phillips
4년 전
앗 그런가요~ ?

댓글을 작성하려면 로그인이 필요합니다.

플래토
4년 전

100% 정확한 설명은 아니지만, 개념적으로 ..설명을드리면

선언의 차이 입니다.

 

첫번째 문장은

 

배열의 값을 

2차원으로 만들어둔 구조이고

 

두번째 문장은

배열의 인수를 배열로 넣은 형태입니다

foreach 는 배열의 값을 기준으로 출력을 합니다.

즉, 처음것은 2차원배열이라서 가로세로가 3번째 값들에 맞게 맞춰진 형태가 된구조이고

두번째는 배열의 요소가 배열이라서 첫번째 요소는 1개짜리 배열, 두번째 요소는 2개짜리 배열, 세번째 요소는 3개짜리 배열이 됩니다.

 

처음문장의 배열의 첫번째 두번째가 값으로 존재하기때문에

구조체를 지원하지 않는 배열은 배열값으로 3행3열을 만들었다고 보시면됩니다.

 

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인