【问题标题】:PHP Create Sub Arrays from Master Array based on keysPHP 根据键从主数组创建子数组
【发布时间】:2020-01-07 18:24:58
【问题描述】:

这与 PHP 有关。 我有一个数组数组,它​​是来自 db 查询的记录集:

Array
(
    [0] => Array
        (
            [0] => Amazon
            [1] => AmazonSendTracking
            [2] => 
            [3] => 1
            [4] => IN
            [5] => 2020-01-07 11:32:18
            [6] => 7
            [7] => 5
        )

    [1] => Array
        (
            [0] => Amazon
            [1] => AmazonGetOrdersAndMove
            [2] => 
            [3] => 4
            [4] => ALL
            [5] => 2020-01-07 11:32:18
            [6] => 6
            [7] => 4
        )

    [2] => Array
        (
            [0] => Test
            [1] => RedirectTest1
            [2] => data=data1&data2=data2&testvar=testvariable
            [3] => 4
            [4] => ALL
            [5] => 2020-01-07 11:32:18
            [6] => 19
            [7] => 17
        )

    [3] => Array
        (
            [0] => Test
            [1] => RedirectTest2
            [2] => data=value&data2=value2&testvar=value3
            [3] => 4
            [4] => ALL
            [5] => 2020-01-07 11:32:18
            [6] => 19
            [7] => 25
        )

    [4] => Array
        (
            [0] => Amazon
            [1] => AmazonPushInventory
            [2] => 
            [3] => 15
            [4] => ALL
            [5] => 2020-01-07 11:32:18
            [6] => 27
            [7] => 26
        )

    [5] => Array
        (
            [0] => Amazon
            [1] => CalculateFloorCeiling
            [2] => 
            [3] => 15
            [4] => ALL
            [5] => 2020-01-07 11:32:18
            [6] => 27
            [7] => 27
        )

    [6] => Array
        (
            [0] => Amazon
            [1] => AmazonSubmitPricingXML
            [2] => 
            [3] => 15
            [4] => ALL
            [5] => 2020-01-07 11:32:18
            [6] => 27
            [7] => 28
        )

    [7] => Array
        (
            [0] => Amazon
            [1] => AmazonSubmitPricingXMLResetBusinessAndFlipEm
            [2] => 
            [3] => 1440
            [4] => OUT
            [5] => 
            [6] => 8
            [7] => 6
        )

)

子数组的第 7 位 (6) 中的值表示我想要分解为单个数组的“组”。

所以我希望上面变成一个不属于任何组的项目数组,然后为每个组创建一个新数组,如下所示:

Array1 - 不在一个组中的所有项目

Array1
(
    [0] => Array
        (
            [0] => Amazon
            [1] => AmazonSendTracking
            [2] => 
            [3] => 1
            [4] => IN
            [5] => 2020-01-07 11:32:18
            [6] => 7
            [7] => 5
        )

    [1] => Array
        (
            [0] => Amazon
            [1] => AmazonGetOrdersAndMove
            [2] => 
            [3] => 4
            [4] => ALL
            [5] => 2020-01-07 11:32:18
            [6] => 6
            [7] => 4
        )
    [2] => Array
        (
            [0] => Amazon
            [1] => AmazonSubmitPricingXMLResetBusinessAndFlipEm
            [2] => 
            [3] => 1440
            [4] => OUT
            [5] => 
            [6] => 8
            [7] => 6
        )
)

Array2 - 第一组

Array2(
 [0] => Array
        (
            [0] => Test
            [1] => RedirectTest1
            [2] => data=data1&data2=data2&testvar=testvariable
            [3] => 4
            [4] => ALL
            [5] => 2020-01-07 11:32:18
            [6] => 19
            [7] => 17
        )

    [1] => Array
        (
            [0] => Test
            [1] => RedirectTest2
            [2] => data=value&data2=value2&testvar=value3
            [3] => 4
            [4] => ALL
            [5] => 2020-01-07 11:32:18
            [6] => 19
            [7] => 25
        )
)

Array3 - 第二组

Array3(
    [0] => Array
        (
            [0] => Amazon
            [1] => AmazonPushInventory
            [2] => 
            [3] => 15
            [4] => ALL
            [5] => 2020-01-07 11:32:18
            [6] => 27
            [7] => 26
        )

    [1] => Array
        (
            [0] => Amazon
            [1] => CalculateFloorCeiling
            [2] => 
            [3] => 15
            [4] => ALL
            [5] => 2020-01-07 11:32:18
            [6] => 27
            [7] => 27
        )

    [2] => Array
        (
            [0] => Amazon
            [1] => AmazonSubmitPricingXML
            [2] => 
            [3] => 15
            [4] => ALL
            [5] => 2020-01-07 11:32:18
            [6] => 27
            [7] => 28
        )
)

我只是不确定哪些数组函数最适合用来完成此任务。我尝试使用以下方法获取每个组的计数。 我有一个循环遍历主数组(数组数组调用 $rs),在循环中,我将第 7 个位置拉到一个名为 $HeaderRecNbr 的变量中,然后执行以下操作:

$GroupCount=array_count_values(array_column($rs, 6))[$HeaderRecNbr];

但我不确定从这里去哪里。

【问题讨论】:

  • 总是在第7位吗?您是否正在寻找 array_count_values() 函数来返回一个数组数组,其中包含按组值组织的数组(在索引 6 中)?
  • 值是位置 7(数组中基于零的计数中的 6)将始终表示组的 ID。

标签: php arrays loops subset


【解决方案1】:

只需创建一个由索引 6 开始的组索引的数组。这将为每个由组号索引的组创建一个子数组:

foreach($array as $v) {
    $groups[$v[6]][] = $v;
}

然后要获取一组中单独的项目,检查是否恰好有一个子数组并将其添加到另一个数组中。然后将其从组数组中移除:

foreach($groups as $k => $v) {
    if(count($v) == 1) {
        $other[] = $v;  // or $other[$v[0][6]][] = $v;
        unset($groups[$k]);
    }
}

【讨论】:

  • 这很完美!请注意,您的未设置中有一个错字,该数组名为 $groups 而不是 $group。谢谢!
  • 现在我有一个数组 $groups,其索引基于组 ID(位置 6),我该如何安排 $other 数组,使其也具有基于组 ID 的索引?跨度>
  • 做同样的事情$other[$v[6]][] = $v; 编辑了评论
  • 我得到未定义的偏移量:6 现在。
  • 对不起,我没有测试只是在我脑海中可视化数组。
【解决方案2】:
    $mainArray = ... all rows variable here..
$groupedArray = [];
$countArray = [];
foreach ($mainArray as $k => $v) {
    $groupedArray[$v[6]][] = $v;
    $countArray[$v[6]]++;
}
$singleItems = [];
$multipleItems = [];
foreach ($groupedArray as $k => $v) {
    if ($countArray[$k] > 1) $multipleItems[] = $v;
    else $singleItems = $v;
}

... do something with single and multi - groups...

1:首先按子数组的第 6 项将所有项目分组...同时保持它们的计数 2. 在 2 个数组中分隔单个和多个项目组... 3. 对多项目组做任何你需要的事情。

【讨论】:

    【解决方案3】:

    此函数将按所需索引对它们进行分组,然后将没有任何其他具有相同索引的那些组合起来,并返回一个数组数组,未分组,然后全部分组。

    function sortByIndex( $data, $index ) {
        $sortedData = array();
        $ungroupedData = array();
        // Make sure you can loop through
        if ( ! is_array( $data ) ) {
            return FALSE;
        }
        foreach ( $data as $key => $arrayToInspect ) {
            if ( ! isset( $sortedData[$arrayToInspect[$index]] ) ) {
                $sortedData[$arrayToInspect[$index]] = array();
            }
            $sortedData[$arrayToInspect[$index]][] = $arrayToInspect;
        }
    
        // Combine as desired
        foreach ( $sortedData as $groupId => $data ) {
            if ( count( $data ) < 2 ) {
                $ungroupedData[] = $data;
                unset( $sortedData[$groupId] );
            }
        }
        return ( array_merge( [ $ungroupedData ], array_values( $sortedData ) ) );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-02
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 2015-02-18
      相关资源
      最近更新 更多