[英]group array based on similar values in PHP
原始數組為:
array (
0 =>
array (
'order_id' => '5870',
'email' => 'fak*****mid@gmail.com',
'item' => 'carrier',
'IMEI' => '353337073126392',
),
1 =>
array (
'order_id' => '5877',
'email' => 'asl***mid@gmail.com',
'item' => 'network',
'IMEI' => '354447064267144',
),
2 =>
array (
'order_id' => '5878',
'email' => 'pab***mid@gmail.com',
'item' => 'O2 UK',
'IMEI' => '35495207085492',
),
3 =>
array (
'order_id' => '5879',
'email' => 'persi****dia@yahoo.com',
'item' => 'carrier',
'IMEI' => '353337073126392',
),
4 =>
array (
'order_id' => '5882',
'email' => 'di***r18@gmail.com',
'item' => 'blacklist check',
'IMEI' => '354407067239243',
),
5 =>
array (
'order_id' => '5884',
'email' => 'm***matin@gmail.com',
'item' => 'Vodafone',
'IMEI' => '353337073126392',
),
)
如您所見,數組#0,#3,#5具有相同的IMEI號。 我的問題是如何根據相同的IMEI值對數組進行分組。 我想從原始數組中派生出三個不同的數組。 就像是:
ArrayA
1 =>
array (
'order_id' => '5877',
'email' => 'asl***mid@gmail.com',
'item' => 'network',
'IMEI' => '354447064267144',
),
2 =>
array (
'order_id' => '5878',
'email' => 'pab***mid@gmail.com',
'item' => 'O2 UK',
'IMEI' => '35495207085492',
),
4 =>
array (
'order_id' => '5882',
'email' => 'di****18@gmail.com',
'item' => 'blacklist check',
'IMEI' => '354407067239243',
),
)
現在,數組#0,#3,#5具有相同的IMEI號,但數組#0,#3也具有相同的項目名稱。 所以ArrayB就像這樣:
ArrayB
0 =>
array (
'order_id' => '5870',
'email' => 'fak*****mid@gmail.com',
'item' => 'carrier',
'IMEI' => '353337073126392',
),
3 =>
array (
'order_id' => '5879',
'email' => 'persi****dia@yahoo.com',
'item' => 'carrier',
'IMEI' => '353337073126392',
),
)
最后,ArrayC將會是這樣的:
ArrayC
5 =>
array (
'order_id' => '5884',
'email' => 'mo****tin@gmail.com',
'item' => 'Vodafone',
'IMEI' => '353337073126392',
),
)
我知道我可以使用FOR循環並檢查IMEI值,但是以防萬一有一種我不知道的更干凈的方式?
我不確定這是最好的解決方案,但可以嘗試使用此代碼
$a = [
[
'order_id' => '5870',
'email' => 'fak*****mid@gmail.com',
'item' => 'carrier',
'IMEI' => '353337073126392',
],[
'order_id' => '5877',
'email' => 'asl***mid@gmail.com',
'item' => 'network',
'IMEI' => '354447064267144',
],[
'order_id' => '5878',
'email' => 'pab***mid@gmail.com',
'item' => 'O2 UK',
'IMEI' => '35495207085492',
],[
'order_id' => '5879',
'email' => 'persi****dia@yahoo.com',
'item' => 'carrier',
'IMEI' => '353337073126392',
],[
'order_id' => '5882',
'email' => 'di***r18@gmail.com',
'item' => 'blacklist check',
'IMEI' => '354407067239243',
],[
'order_id' => '5884',
'email' => 'm***matin@gmail.com',
'item' => 'Vodafone',
'IMEI' => '353337073126392',
],
];
function groupData($datas, $firstKey, $secondKey)
{
//Define output
$firstGroup = [];
$secondGroup = [];
$thirdGroup = [];
$tmps = [];
$tmpIds = [];
//check first key
foreach ($datas as $data) {
if (!isset($firstGroup[$data[$firstKey]])) {
if (!in_array($data[$firstKey], $tmpIds) ) {
$firstGroup[$data[$firstKey]] = $data;
$tmpIds[] = $data[$firstKey];
} else {
$tmps[] = $data;
}
} else {
$old = $firstGroup[$data[$firstKey]];
//remove from first and add to tmps
unset($firstGroup[$data[$firstKey]]);
$tmps[] = $old;
$tmps[] = $data;
}
}
//check tmps key
foreach ($tmps as $each) {
if (!isset($thirdGroup[$each[$firstKey].$each[$secondKey]])) {
$thirdGroup[$each[$firstKey].$each[$secondKey]] = $each;
} else {
$old = $thirdGroup[$each[$firstKey].$each[$secondKey]];
$secondGroup[uniqid()] = $old;
//remove from first and add to second
unset($thirdGroup[$each[$firstKey].$each[$secondKey]]);
$secondGroup[uniqid()] = $each;
}
}
return [
'first' => $firstGroup,
'second' => $secondGroup,
'third' => $thirdGroup
];
}
$res = groupData($a, 'IMEI', 'item');
print_r(array_values($res['first']));
print_r(array_values($res['second']));
print_r(array_values($res['third']));
希望這個幫助
您可以使用array_reduce
:
$result = array_reduce($array, function ($result, $item) {
if (!isset($result[$item['IMEI']][$item['item']])) {
$result[$item['IMEI']][$item['item']] = [];
}
$result[$item['IMEI']][$item['item']][] = $item;
return $result;
}, []);
這是工作演示 。
該解決方案與php5.2兼容,並且在語法上與我在php7中編寫的一樣干凈。
將每個子數組的IMEI
值用作結果數組中的臨時鍵,並在迭代時繼續將新數據推入結果數組。
代碼:( 演示 )
$array = array(
array('order_id' => '5870', 'email' => 'fak*****mid@gmail.com', 'item' => 'carrier', 'IMEI' => '353337073126392'),
array('order_id' => '5877', 'email' => 'asl***mid@gmail.com', 'item' => 'network', 'IMEI' => '354447064267144'),
array('order_id' => '5878', 'email' => 'pab***mid@gmail.com', 'item' => 'O2 UK', 'IMEI' => '35495207085492'),
array('order_id' => '5879', 'email' => 'persi****dia@yahoo.com', 'item' => 'carrier', 'IMEI' => '353337073126392'),
array('order_id' => '5882', 'email' => 'di***r18@gmail.com', 'item' => 'blacklist check', 'IMEI' => '354407067239243'),
array('order_id' => '5884', 'email' => 'm***matin@gmail.com', 'item' => 'Vodafone', 'IMEI' => '353337073126392')
);
foreach ($array as $row) {
$result[$row['IMEI']][] = $row;
}
var_export(array_values($result));
輸出:
array (
0 =>
array (
0 =>
array (
'order_id' => '5870',
'email' => 'fak*****mid@gmail.com',
'item' => 'carrier',
'IMEI' => '353337073126392',
),
1 =>
array (
'order_id' => '5879',
'email' => 'persi****dia@yahoo.com',
'item' => 'carrier',
'IMEI' => '353337073126392',
),
2 =>
array (
'order_id' => '5884',
'email' => 'm***matin@gmail.com',
'item' => 'Vodafone',
'IMEI' => '353337073126392',
),
),
1 =>
array (
0 =>
array (
'order_id' => '5877',
'email' => 'asl***mid@gmail.com',
'item' => 'network',
'IMEI' => '354447064267144',
),
),
2 =>
array (
0 =>
array (
'order_id' => '5878',
'email' => 'pab***mid@gmail.com',
'item' => 'O2 UK',
'IMEI' => '35495207085492',
),
),
3 =>
array (
0 =>
array (
'order_id' => '5882',
'email' => 'di***r18@gmail.com',
'item' => 'blacklist check',
'IMEI' => '354407067239243',
),
),
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.