Php 按两个值对多维数组进行分组

Php 按两个值对多维数组进行分组,php,Php,我有这样的数组 [11] => Array ( [transactioncurrencyid] => Array ( [!name] => US Dollar [!] => {041E3DC9-D938-DD11-982C-0013724C58B7} ) [smi_processingmonth] => Array

我有这样的数组

[11] => Array
    (
        [transactioncurrencyid] => Array
            (
                [!name] => US Dollar
                [!] => {041E3DC9-D938-DD11-982C-0013724C58B7}
            )

        [smi_processingmonth] => Array
            (
                [!date] => 6/1/2011
                [!time] => 2:27 PM
                [!] => 2011-06-01T14:27:00-07:00
            )

        [smi_cchistoryid] => {678C5036-9EAA-E111-88E0-00155D010302}
        [smi_includeindeal] => Array
            (
                [!name] => No
                [!] => 0
            )

                  [smi_locationid] => Array
            (
                [!name] => 1134 Hooksett Rd
                [!] => {5CC1585B-91AA-E111-88E0-00155D010302}
            )
    )

[12] => Array
    (
        [transactioncurrencyid] => Array
            (
                [!name] => US Dollar
                [!] => {041E3DC9-D938-DD11-982C-0013724C58B7}
            )


        [smi_processingmonth] => Array
            (
                [!date] => 5/1/2011
                [!time] => 2:27 PM
                [!] => 2011-05-01T14:27:00-07:00
            )

        [smi_cchistoryid] => {688C5036-9EAA-E111-88E0-00155D010302}
        [smi_includeindeal] => Array
            (
                [!name] => No
                [!] => 0
            )

        [smi_locationid] => Array
            (
                [!name] => 1134 Hooksett Rd
                [!] => {5CC1585B-91AA-E111-88E0-00155D010302}
            )
    )
如何按位置id然后按smi_processingmonth对它们进行分组

所以我得到了这样的东西

[1134 Hooksett Rd] => Array
    (
        [ 5/1/2011] = array(
            [transactioncurrencyid] => Array
            (
                [!name] => US Dollar
                [!] => {041E3DC9-D938-DD11-982C-0013724C58B7}
            )


            [smi_processingmonth] => Array
                (
                    [!date] => 5/1/2011
                    [!time] => 2:27 PM
                    [!] => 2011-05-01T14:27:00-07:00
                )

            [smi_cchistoryid] => {688C5036-9EAA-E111-88E0-00155D010302}
            [smi_includeindeal] => Array
                (
                    [!name] => No
                    [!] => 0
                )

            [smi_locationid] => Array
                (
                    [!name] => 1134 Hooksett Rd
                    [!] => {5CC1585B-91AA-E111-88E0-00155D010302}

             )
           )
         [1/1/2011] = array(
          [transactioncurrencyid] => Array
            (
                [!name] => US Dollar
                [!] => {041E3DC9-D938-DD11-982C-0013724C58B7}
            )

        [smi_processingmonth] => Array
            (
                [!date] => 6/1/2011
                [!time] => 2:27 PM
                [!] => 2011-06-01T14:27:00-07:00
            )

        [smi_cchistoryid] => {678C5036-9EAA-E111-88E0-00155D010302}
        [smi_includeindeal] => Array
            (
                [!name] => No
                [!] => 0
            )

                  [smi_locationid] => Array
            (
                [!name] => 1134 Hooksett Rd
                [!] => {5CC1585B-91AA-E111-88E0-00155D010302}
            )
            )
    )
我试过了

   foreach($array as $keys)
                {

                    $key =  $keys['smi_processingmonth']['!date'];;
                    if (!isset($groups[$key])) 
                    {
                        $groups[$key] =  array($keys);
                    } else {
                        $groups[$key][] = $keys;
                    }
                }
                $newGroups = array();

                if(is_array($groups))
                {
                    foreach($groups as $cats => $values)
                    {

                        foreach($values as $itemValues){
                            $st = rtrim(trim($itemValues['smi_locationid']['!']));
                                $key = $st;
                                if (!isset($newGroups[$key])) 
                                {
                                    $newGroups[$key] = array($groups);

                                } else {
                                    $newGroups[$key][] = $itemValues;
                                }
                            }
                        }
                    }

谢谢

嗯,我还没有测试过。但这不只是:

$new_structure = array();
foreach ( $data as $row ) {
  $key1 = rtrim(trim($row['smi_locationid']['!name']));
  $key2 = rtrim(trim($row['smi_processingmonth']['!date']));
  $new_structure[$key1][$key2] = $row;
}

这段代码可以使用一些isset(),但为了清晰起见,我决定将它们保留在外。

嗯,我还没有测试过它。但这不只是:

$new_structure = array();
foreach ( $data as $row ) {
  $key1 = rtrim(trim($row['smi_locationid']['!name']));
  $key2 = rtrim(trim($row['smi_processingmonth']['!date']));
  $new_structure[$key1][$key2] = $row;
}

这段代码可能会使用一些isset(),但为了清晰起见,我决定将它们保留在外。

以下内容将生成所需的输出数组,并正确排序:

function transaction_datecmp($tran1, $tran2)
{
   return strtotime($tran1['smi_processingmonth']['!']) -
          strtotime($tran2['smi_processingmonth']['!']);
}

$output_arr = array();
foreach ($input_arr as $transaction) {
   $location = $transaction['smi_locationid']     ['!name'];
   $date     = $transaction['smi_processingmonth']['!date'];
   $output_arr[$location][$date] = $transaction;
}
ksort($output_arr); // sorts by location
foreach ($output_arr as &$transaction_arr) {
   uasort($transaction_arr, 'transaction_datecmp');
}
您的数据结构依赖于一个假设,即同一天不能有两个事务,这是一个有点危险的假设。此外,使用位置作为键也很不理想(因为拼写、位置变化等原因)——除非它真的应该分组,比如纸质邮件


数据清理,如修剪字符串,应事先完成,最好在数据输入时进行。

以下操作将生成所需的输出数组,并正确排序:

function transaction_datecmp($tran1, $tran2)
{
   return strtotime($tran1['smi_processingmonth']['!']) -
          strtotime($tran2['smi_processingmonth']['!']);
}

$output_arr = array();
foreach ($input_arr as $transaction) {
   $location = $transaction['smi_locationid']     ['!name'];
   $date     = $transaction['smi_processingmonth']['!date'];
   $output_arr[$location][$date] = $transaction;
}
ksort($output_arr); // sorts by location
foreach ($output_arr as &$transaction_arr) {
   uasort($transaction_arr, 'transaction_datecmp');
}
您的数据结构依赖于一个假设,即同一天不能有两个事务,这是一个有点危险的假设。此外,使用位置作为键也很不理想(因为拼写、位置变化等原因)——除非它真的应该分组,比如纸质邮件


数据清理,如修剪字符串,应事先进行,最好在数据输入时进行。

摘自Johan,稍作修改:

  • 如果已经使用修剪,则避免使用ltrim
  • 在函数中,我可以使用临时变量来保持可读性
  • 添加最后一个[],以避免在原始请求之外发生严重的$name/$date冲突,但更安全

摘自Johan,稍作修改:

  • 如果已经使用修剪,则避免使用ltrim
  • 在函数中,我可以使用临时变量来保持可读性
  • 添加最后一个[],以避免在原始请求之外发生严重的$name/$date冲突,但更安全