簡體   English   中英

基於PHP中相似值的組數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM