php 배열 출력

php 배열 출력

QA

php 배열 출력

본문


$arr=array(
    "a"=>"aa",
    "b"=>"ba",
    "c"=>array("x","y","z"));
$arr_cnt = count(max(array_values($arr)));
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>";

 

출력 결과는

aa | 0 | 0

ba | 0 | 0

x   | y | z

그런데......

 


$arr2=array(
    "a"=>array("aa"),
    "b"=>array("ba","bb"),
    "c"=>array("x","y","z")
);
$arr2_cnt = count(max(array_values($arr2)));
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>";

출력 결과는

aa | 

ba | bb 

x   | y | z

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

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

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

이 질문에 댓글 쓰기 :

답변 6

 


<?php
$arr2=array(
    "a"=>array("aa"),
    "b"=>array("ba","bb"),
    "c"=>array("x","y","z")
);
$arr2_cnt = count(max(array_values($arr2)));
echo "<table border=1>";
 
foreach($arr2 as $key => $value){
    echo "<tr>";
    for($s=0; $s<$arr2_cnt; $s++)
    {
        echo '<td>';
        echo (isset($arr2[$key][$s])) ? $arr2[$key][$s] : '0';
        echo '</td>';
    }
    echo '</tr>';
}
?>

 

두개의 조건다포함할경우


<?php
$arr2=array(
    "a"=>array("aa"),
    "b"=>"ba",
    "c"=>array("x","y","z"));
 
$arr2_cnt = count(max(array_values($arr2)));

 
echo "<table border=1>";
 
foreach($arr2 as $key => $value){
    echo "<tr>";
    if(is_array($arr2[$key])){
    for($s=0; $s<$arr2_cnt; $s++)
    {
        echo '<td>';
        echo (isset($arr2[$key][$s])) ? $arr2[$key][$s] : '0';
        echo '</td>';
    }
}else{
    echo '<td>'.$value.'</td>';
    for($s=0; $s<$arr2_cnt-1; $s++)
    {
        echo '<td>0</td>';
    }
}
    echo '</tr>';
}
?>

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

선언의 차이 입니다.

 

첫번째 문장은

 

배열의 값을 

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

 

두번째 문장은

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

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

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

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

 

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

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

 

$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;

}

이렇게 해야 합니다.


 


그렇군요.
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()는 필요가 없군요.

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

0이 찍힌 것이고,

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

없었던거죠.

둘째 코드는 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>";
        }
    }

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


$arr=array(
    "a"=>array("aa"),
    "b"=>array("ba","bb"),
    "c"=>array("x","y","z")
);
$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>";
답변을 작성하시기 전에 로그인 해주세요.
전체 123,638 | RSS
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT