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_merge 함수로는 안되나요?
array_merge 등 여러가지 해 봤는데 원하는 대로 안되는 것 같아요
foreach로 푼다음에 in_array나 array_search로 해야될거에요
$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);
중복 foreach 로 자체 해결했습니다 ㅎㅎ 답변과 관심 감사합니다