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

php 배열 합치기 채택완료

미나라 2년 전 조회 2,339

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

채택된 답변
+20 포인트
2년 전

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

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

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

 

 

 

</p>

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

    }

}</p>

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

        }

    }</p>

<p>    //그린키위 같이 값이 없는

    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>";</p>

<p>/*

 Array

(

    [0] => Array

        (

            [brand_name] => 아보카도

            [quantity] => 200

            [sum] => 2000

            [quantity1] => 0

            [sum1] => 0

        )</p>

<p>    [1] => Array

        (

            [brand_name] => 레몬

            [quantity] => 100

            [sum] => 1000

            [quantity1] => 50

            [sum1] => 100

        )</p>

<p>    [2] => Array

        (

            [brand_name] => 그린키위

            [quantity] => 0

            [sum] => 0

            [quantity1] => 0

            [sum1] => 0

        )</p>

<p>    [3] => Array

        (

            [brand_name] => 파인애플

            [quantity] => 0

            [sum] => 0

            [quantity1] => 100

            [sum1] => 3000

        )</p>

<p>)

*/</p>

<p>

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

답변에 대한 댓글 1개

리오닥터
2년 전
저랑 비슷한 방법으로 개발하네요 ㅋㅋ

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

중복 foreach 로 자체 해결했습니다 ㅎㅎ 답변과 관심 감사합니다

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

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

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

</p>

<p><?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);</p>

<p>

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

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

2년 전

</p>

<p><?php

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

<p> </p>

<p>$a = array(

    array('brand_name' => '레몬', 'quantity' => 100, 'sum' => 1000), 

    array('brand_name' => '아보카도', 'quantity' => 200, 'sum' => 2000)

);</p>

<p> </p>

<p>$b = array(

    array('brand_name' => '레몬', 'quantity1' => 50, 'sum1' => 100), 

    array('brand_name' => '파인애플', 'quantity1' => 100, 'sum1' => 3000)

);</p>

<p> </p>

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

    }

}</p>

<p> </p>

<p>$c = array();</p>

<p> </p>

<p>for ($i = 0, $i_cnt = count($cat); $i < $i_cnt; $i++) {

    $c[$i] = $tmpl;

    $c[$i]['brand_name'] = $cat[$i];</p>

<p>    foreach ($arrs as $arr) {

        if ($arr['brand_name'] == $c[$i]['brand_name']) {

            $c[$i] = array_merge($c[$i], $arr);

        }

    }

}</p>

<p> </p>

<p>print_r($c);

/*

Array

(

    [0] => Array

        (

            [brand_name] => 아보카도

            [quantity] => 200

            [sum] => 2000

            [quantity1] => 0

            [sum1] => 0

        )</p>

<p>    [1] => Array

        (

            [brand_name] => 레몬

            [quantity] => 100

            [sum] => 1000

            [quantity1] => 50

            [sum1] => 100

        )</p>

<p>    [2] => Array

        (

            [brand_name] => 그린키위

            [quantity] => 0

            [sum] => 0

            [quantity1] => 0

            [sum1] => 0

        )</p>

<p>    [3] => Array

        (

            [brand_name] => 파인애플

            [quantity] => 0

            [sum] => 0

            [quantity1] => 100

            [sum1] => 3000

        )</p>

<p>)

*/

?></p>

<p>

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

답변에 대한 댓글 1개

리오닥터
2년 전
와... 우!! 저걸 한방에 해결 하셨군요 ㅋㅋ

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

2년 전

</p>

<p>$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'];

}</p>

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

    }

}</p>

<p>echo '<pre>';

print_r($c);

echo '</pre>';</p>

<p>

 

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

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

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

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

foreach로 푼다음에 in_array나 array_search로 해야될거에요 

 

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

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

array_merge 등 여러가지 해 봤는데 원하는 대로 안되는 것 같아요

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

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

array_merge 함수로는 안되나요?

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

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

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

로그인