php 배열 합치기

php 배열 합치기

QA

php 배열 합치기

본문

$cat를 기반으로 $a와 $b를 합쳐서 $c와 같은 형태의 데이터를 도출하고 싶습니다.

이리저리 해봐도 잘 안되서 질문 올립니다.

고수 님들의 도움이 절실하게 필요합니다.

 

 

 

$cat = ['아보카도', '레몬',  '그린키위', '파인애플'];

 

$a = array(array('brand_name' => '레몬', 'quantity' => 100, 'sum' => 1000), array('brand_name' => '아보카도', 'quantity' => 200, 'sum' => 2000));

$b = array(array('brand_name' => '레몬', 'quantity1' => 50, 'sum1' => 100), array('brand_name' => '파인애플', 'quantity1' => 100, 'sum1' => 3000));


 

$c = [

  [

    'brand_name' => '아보카도',

    'quantity' => 200,

    'sum' => 2000,

    'quantity1' => 0, //$b에 데이터가 없으므로

    'sum1' => 0 //$b에 데이터가 없으므로

  ],

  [

    'brand_name' => '레몬',

    'quantity' => 100,

    'sum' => 1000,

    'quantity1' => 50, //$b에 데이터가 있으므로

    'sum1' => 1000 //$b에 데이터가 있으므로

  ],

  [

    'brand_name' => '그린키위',

    'quantity' => 0, //$a에 데이터가 없으므로

    'sum' => 0, //$a에 데이터가 없으므로

    'quantity1' => 0, //$b에 데이터가 없으므로

    'sum1' => 0 //$b에 데이터가 없으므로

  ],

  [

    'brand_name' => '파인애플',

    'quantity' => 0, //$a에 데이터가 없으므로

    'sum' => 0, //$a에 데이터가 없으므로

    'quantity1' => 100, //$b에 데이터가 있으므로

    'sum1' => 3000 //$b에 데이터가 있으므로

  ]

 

];

 

이 질문에 댓글 쓰기 :

답변 8

베르만님의 소스가 너무 깔끔하니 좋네요  내거 보다 베르만님꺼 보니 황홀하네요 : )

array_merge(current($a), current($b));   처음 본 형식인데 배웠습니다

다른 방법으로 결과는 같이 나오길래  적어 봅니다

 

 

 


$cat = ['아보카도', '레몬',  '그린키위', '파인애플'];
$a1 = array(
        array('brand_name' => '레몬',    'quantity' => 100, 'sum' => 1000, 'quantity1' => 0,   'sum1' => 0), 
        array('brand_name' => '아보카도',  'quantity' => 200, 'sum' => 2000, 'quantity1' => 0,   'sum1' => 0)
);
$b1 = array(
        array('brand_name' => '레몬', 'quantity' => 0,   'sum' => 0,    'quantity1' => 50,   'sum1' => 100), 
        array('brand_name' => '파인애플', 'quantity' => 0,   'sum' => 0,  'quantity1' => 100, 'sum1' => 3000)
);
 
 
$a = array(); // 브랜드 네임만 담아 루프중 레몬처럼 중복된 값인지 아는 용도로
$b = array(); // 루프를 돌면서 배열을 담는다
$c = array_merge($a1,$b1);
for($i=0; $i<count($cat); $i++){
    if (!in_array($c[$i]['brand_name'], $a)) {
        $ary = array(
            'brand_name' => $c[$i]['brand_name'],
            'quantity'   => !empty($c[$i]['quantity'])  ? $c[$i]['quantity']  : 0,
            'sum'        => !empty($c[$i]['sum'])       ? $c[$i]['sum']       : 0,
            'quantity1'  => !empty($c[$i]['quantity1']) ? $c[$i]['quantity1'] : 0,
            'sum1'       => !empty($c[$i]['sum1'])      ? $c[$i]['sum1']      : 0,
        );
        $a[] = $c[$i]['brand_name'];
        $b[] = $ary; 
    }
    else{
       // 현재 루프중인 중복 레몬값 즉 3번째 레몬값일 때 레몬의 배열값을 변경한다
        $_quantity  = ($c[0]['quantity']) ? $c[0]['quantity']  : $c[$i]['quantity'];
        $_sum       = ($c[0]['sum'])      ? $c[0]['sum']       : $c[$i]['sum'];
        $_quantity1 = ($c[0]['quantity1'])? $c[0]['quantity1'] : $c[$i]['quantity1'];
        $_sum1      = ($c[0]['sum1'])     ? $c[0]['sum1']      : $c[$i]['sum1'];
        $ary = array(
            'brand_name' => $c[$i]['brand_name'],
            'quantity'   => $_quantity ,
            'sum'        => $_sum,
            'quantity1'  => $_quantity1,
            'sum1'       => $_sum1,
        ); 
        $b[0] = $ary;
    }
}
$z = array(); // $cat배열 순서에 맞게 재 조립
for($i=0; $i<count($cat); $i++){
    for($j=0; $j<count($b); $j++){
        if($cat[$i] === $b[$j]['brand_name']){
            $z[$i] = $b[$j];
            continue;
        }
    }
    //그린키위 같이 값이 없는
    if (!in_array($cat[$i], $a)) { 
        $_ary = array(
            'brand_name' => $cat[$i], 
            'quantity'   => 0, 
            'sum'        => 0, 
            'quantity1'  => 0, 
            'sum1'       => 0, 
        ); 
        $z[$i] = $_ary; 
    }
}
echo"<xmp>";
print_r($z);
echo"</xmp>";
/*
 Array
(
    [0] => Array
        (
            [brand_name] => 아보카도
            [quantity] => 200
            [sum] => 2000
            [quantity1] => 0
            [sum1] => 0
        )
    [1] => Array
        (
            [brand_name] => 레몬
            [quantity] => 100
            [sum] => 1000
            [quantity1] => 50
            [sum1] => 100
        )
    [2] => Array
        (
            [brand_name] => 그린키위
            [quantity] => 0
            [sum] => 0
            [quantity1] => 0
            [sum1] => 0
        )
    [3] => Array
        (
            [brand_name] => 파인애플
            [quantity] => 0
            [sum] => 0
            [quantity1] => 100
            [sum1] => 3000
        )
)
*/

<?php
$cat = ['아보카도', '레몬',  '그린키위', '파인애플'];
 
$a = array(
    array('brand_name' => '레몬', 'quantity' => 100, 'sum' => 1000), 
    array('brand_name' => '아보카도', 'quantity' => 200, 'sum' => 2000)
);
 
$b = array(
    array('brand_name' => '레몬', 'quantity1' => 50, 'sum1' => 100), 
    array('brand_name' => '파인애플', 'quantity1' => 100, 'sum1' => 3000)
);
 
$arrs = array_merge($a, $b);
$tmpl = array_merge(current($a), current($b));
foreach ($tmpl as &$v) {
    if (is_int($v) == true) {
        $v = 0;
    } else {
        $v = null;
    }
}
 
$c = array();
 
for ($i = 0, $i_cnt = count($cat); $i < $i_cnt; $i++) {
    $c[$i] = $tmpl;
    $c[$i]['brand_name'] = $cat[$i];
    foreach ($arrs as $arr) {
        if ($arr['brand_name'] == $c[$i]['brand_name']) {
            $c[$i] = array_merge($c[$i], $arr);
        }
    }
}
 
print_r($c);
/*
Array
(
    [0] => Array
        (
            [brand_name] => 아보카도
            [quantity] => 200
            [sum] => 2000
            [quantity1] => 0
            [sum1] => 0
        )
    [1] => Array
        (
            [brand_name] => 레몬
            [quantity] => 100
            [sum] => 1000
            [quantity1] => 50
            [sum1] => 100
        )
    [2] => Array
        (
            [brand_name] => 그린키위
            [quantity] => 0
            [sum] => 0
            [quantity1] => 0
            [sum1] => 0
        )
    [3] => Array
        (
            [brand_name] => 파인애플
            [quantity] => 0
            [sum] => 0
            [quantity1] => 100
            [sum1] => 3000
        )
)
*/
?>

$array = array_merge($a,$b);
$tmp_array = array();
foreach($array as $key=>$val) {
    $tmp_array[$val['brand_name']]['quantity']  = $tmp_array[$val['brand_name']]['quantity'] + $val['quantity'];
    $tmp_array[$val['brand_name']]['quantity1'] = $tmp_array[$val['brand_name']]['quantity1'] + $val['quantity1'];
    $tmp_array[$val['brand_name']]['sum']       = $tmp_array[$val['brand_name']]['sum']  + $val['sum'];
    $tmp_array[$val['brand_name']]['sum1']      = $tmp_array[$val['brand_name']]['sum1'] + $val['sum1'];
}
$c = array();
foreach($cat as $key=>$val) {
    if(isset($tmp_array[$val])) {
        $c[$val] = $tmp_array[$val];
    } else {
        $c[$val]['quantity']  = 0;
        $c[$val]['quantity1'] = 0;
        $c[$val]['sum']       = 0;
        $c[$val]['sum1']      = 0;
    }
}
echo '<pre>';
print_r($c);
echo '</pre>';

 

brand_name 배열 c의 키값으로 사용했습니다.

원하시는 게 이게 맞나 모르겠네요.

답은 위에 있지만 퀴즈 같아서 답변 달아봅니다 ^^


<?php
$cat = ['아보카도', '레몬',  '그린키위', '파인애플'];
  
 $a = array(
     array('brand_name' => '레몬', 'quantity' => 100, 'sum' => 1000), 
     array('brand_name' => '아보카도', 'quantity' => 200, 'sum' => 2000)
 );
  
 $b = array(
     array('brand_name' => '레몬', 'quantity1' => 50, 'sum1' => 100), 
     array('brand_name' => '파인애플', 'quantity1' => 100, 'sum1' => 3000)
 );
 
 $merged = array_merge($a, $b);
 $brand_names = array_column($merged, 'brand_name');
 $c = array();
 foreach($cat as $k=>$v) {
     $data = in_array($v, $brand_names) ? $merged[array_search($v, $brand_names)] : array();
     $c[] = array_merge(array('brand_name'=>$v, 'quantity'=>0, 'sum'=>0, 'quantity1'=>0, 'sum1'=>0), $data);
 }
 print_r2($c);
답변을 작성하시기 전에 로그인 해주세요.
전체 123,532 | RSS
QA 내용 검색

회원로그인

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