在PHP中按多个字段动态分组数据

在PHP中按多个字段动态分组数据,php,multidimensional-array,grouping,Php,Multidimensional Array,Grouping,我想按字段对关联数组进行分组。数组本身最初来自mysql数据库查询 下面是我如何通过硬编码实现的示例: <?php $fields = array("ID,subID"); $fieldCounts = count($fields); $data = array(); //there is sql querieed data $parsedData = array(); foreach ($data as $val) { if ($fieldCounts == 1)

我想按字段对关联数组进行分组。数组本身最初来自mysql数据库查询

下面是我如何通过硬编码实现的示例:

<?php
$fields = array("ID,subID");
$fieldCounts = count($fields);
$data = array(); //there is sql querieed data



$parsedData = array();

foreach ($data as $val)
{
    if ($fieldCounts == 1)
    {
        $f0 = $fields[0];
        $fv0 = $val[$f0];
        $parsedData[$fv0][] = $val;
    }
    else if ($fieldCounts == 2)
    {
        $f0 = $fields[0];
        $fv0 = $val[$f0];
        $f1 = $fields[10];
        $fv1 = $val[$f1];
        $parsedData[$fv0][$f1][] = $val;
    }
    else
    {
        exit("Third field not implemented");
    }
}
?>


但是,如何使用任意数量的字段动态地执行它呢?

而不是在
$data
foreach循环中执行if/elseif/else(它总是限制在使用该结构和大量代码重复在其中“写入”的数量),您需要将if/elseif/else转换为它自己的循环

但首先转换现有代码,我从第一个if体开始,它已经包含了所有必要的代码:

$val
应分配给数组
$parsedData
,该数组由
$fields
名称
$val
ue键入。让我们在此进行压缩,名称中的数字
0
是多余的,因为我们不再需要它(但可能是第一个):

(我将
$val
更改为
$values
以改进命名)。这现在更容易阅读和理解。此外,我们还可以更容易地在这里发现幻数
0

现在来看看魔术。我们想在此处添加一个数组(推送):

为了让这更容易,让我们这样做:

$array   = &$parsedData[$value];
$array[] = $values;
现在这似乎是多余的,但当这变成一个循环时,它将变得更加清晰:

$array   = &$parsedData;

...

$array   = &array[$value];

...

$array[] = $values;
现在让我们回顾一下外部循环中的代码:

foreach ($data as $values)
{

    $array   = &$parsedData; 

    $field = $fields[0];
    $value = $values[$field];        
    $array = &$array[$value];

    $array[] = $values;
}
显然,这段代码还不完整。内环缺失,但它开始得到某种身体。实际上,内部循环很容易实现:

$array   = &$parsedData; 

foreach ($fields as $field)
{
    $value = $values[$field];
    $array = &$array[$value];
}

$array[] = $values;
就这样。单个字段已转化为对所有字段的迭代。迭代中每个步骤的子数组别名/引用允许在内部循环完成后将值推送到适当的数组条目

整个外环和内环:

foreach ($data as $values)
{
    $array   = &$parsedData; # set reference

    foreach ($fields as $field)
    {
        $value = $values[$field];
        $array = &$array[$value];
    }

    $array[] = $values;

    unset($array); # remove reference
}

您需要将if/elseif/else转换为自己的循环,而不是在
$data
foreach循环中执行if/elseif/else操作(该循环始终限于使用该结构和大量代码重复在其中“写入”的数量)

但首先转换现有代码,我从第一个if体开始,它已经包含了所有必要的代码:

$val
应分配给数组
$parsedData
,该数组由
$fields
名称
$val
ue键入。让我们在此进行压缩,名称中的数字
0
是多余的,因为我们不再需要它(但可能是第一个):

(我将
$val
更改为
$values
以改进命名)。这现在更容易阅读和理解。此外,我们还可以更容易地在这里发现幻数
0

现在来看看魔术。我们想在此处添加一个数组(推送):

为了让这更容易,让我们这样做:

$array   = &$parsedData[$value];
$array[] = $values;
现在这似乎是多余的,但当这变成一个循环时,它将变得更加清晰:

$array   = &$parsedData;

...

$array   = &array[$value];

...

$array[] = $values;
现在让我们回顾一下外部循环中的代码:

foreach ($data as $values)
{

    $array   = &$parsedData; 

    $field = $fields[0];
    $value = $values[$field];        
    $array = &$array[$value];

    $array[] = $values;
}
显然,这段代码还不完整。内环缺失,但它开始得到某种身体。实际上,内部循环很容易实现:

$array   = &$parsedData; 

foreach ($fields as $field)
{
    $value = $values[$field];
    $array = &$array[$value];
}

$array[] = $values;
就这样。单个字段已转化为对所有字段的迭代。迭代中每个步骤的子数组别名/引用允许在内部循环完成后将值推送到适当的数组条目

整个外环和内环:

foreach ($data as $values)
{
    $array   = &$parsedData; # set reference

    foreach ($fields as $field)
    {
        $value = $values[$field];
        $array = &$array[$value];
    }

    $array[] = $values;

    unset($array); # remove reference
}

我不确定这段代码是如何为您工作的,但有些事情是错误的,可能不允许代码正常工作

  • 字段只有一个值,带有

    $fields = array("ID,subID"); 
                       ^----------- between string 
    
    而不是

  • 注意:未定义的偏移量:

    $f1 = $fields[10];
                   ^----- your array is not up to 10
    
因为您没有将生成的数据和所需的输出放在一起。我将假设您的最终输出并生成一些临时数据

$fields = array("ID","subID"); //You can Increase or decrease this Fields
$fieldCounts = count($fields);
$data = array(); // there is sql querieed data

for($i = 0; $i < 3; $i ++) {
    $data[] = array("ID" => mt_rand(1, 1000),"subID" => "sub" . mt_rand(100, 900));
}
输出

Array
(
    [159] => Array
        (
            [subID] => Array  <----------- SubID is fixed in your can cause confict
                (
                    [0] => Array
                        (
                            [ID] => 159
                            [subID] => sub589
                        )

                )

        )

    [334] => Array
        (
            [subID] => Array
                (
                    [0] => Array
                        (
                            [ID] => 334
                            [subID] => sub703
                        )

                )

        )

)
Array
(
    [159] => Array
        (
            [sub589] => Array <---------- Make Sub ID Dynamic 
                (
                    [0] => Array
                        (
                            [ID] => 159
                            [subID] => sub589
                        )

                )

        )

    [334] => Array
        (
            [sub703] => Array
                (
                    [0] => Array
                        (
                            [ID] => 334
                            [subID] => sub703
                        )

                )

        )

)
Array
(
    [159] => Array
        (
            [sub589] => Array <---- Easy to asses as $parsedData['159']['sub589']
                (
                    [ID] => 159
                    [subID] => sub589
                )

        )

    [334] => Array
        (
            [sub703] => Array
                (
                    [ID] => 334
                    [subID] => sub703
                )

        )

)
输出

Array
(
    [159] => Array
        (
            [subID] => Array  <----------- SubID is fixed in your can cause confict
                (
                    [0] => Array
                        (
                            [ID] => 159
                            [subID] => sub589
                        )

                )

        )

    [334] => Array
        (
            [subID] => Array
                (
                    [0] => Array
                        (
                            [ID] => 334
                            [subID] => sub703
                        )

                )

        )

)
Array
(
    [159] => Array
        (
            [sub589] => Array <---------- Make Sub ID Dynamic 
                (
                    [0] => Array
                        (
                            [ID] => 159
                            [subID] => sub589
                        )

                )

        )

    [334] => Array
        (
            [sub703] => Array
                (
                    [0] => Array
                        (
                            [ID] => 334
                            [subID] => sub703
                        )

                )

        )

)
Array
(
    [159] => Array
        (
            [sub589] => Array <---- Easy to asses as $parsedData['159']['sub589']
                (
                    [ID] => 159
                    [subID] => sub589
                )

        )

    [334] => Array
        (
            [sub703] => Array
                (
                    [ID] => 334
                    [subID] => sub703
                )

        )

)
输出

Array
(
    [159] => Array
        (
            [subID] => Array  <----------- SubID is fixed in your can cause confict
                (
                    [0] => Array
                        (
                            [ID] => 159
                            [subID] => sub589
                        )

                )

        )

    [334] => Array
        (
            [subID] => Array
                (
                    [0] => Array
                        (
                            [ID] => 334
                            [subID] => sub703
                        )

                )

        )

)
Array
(
    [159] => Array
        (
            [sub589] => Array <---------- Make Sub ID Dynamic 
                (
                    [0] => Array
                        (
                            [ID] => 159
                            [subID] => sub589
                        )

                )

        )

    [334] => Array
        (
            [sub703] => Array
                (
                    [0] => Array
                        (
                            [ID] => 334
                            [subID] => sub703
                        )

                )

        )

)
Array
(
    [159] => Array
        (
            [sub589] => Array <---- Easy to asses as $parsedData['159']['sub589']
                (
                    [ID] => 159
                    [subID] => sub589
                )

        )

    [334] => Array
        (
            [sub703] => Array
                (
                    [ID] => 334
                    [subID] => sub703
                )

        )

)
数组
(
[159]=>阵列
(
[sub589]=>阵列159
[subID]=>sub589
)
)
[334]=>阵列
(
[sub703]=>阵列
(
[ID]=>334
[subID]=>sub703
)
)
)

我不确定这段代码是如何为您工作的,但有些事情是错误的,可能不允许代码正常工作

  • 字段只有一个值,带有

    $fields = array("ID,subID"); 
                       ^----------- between string 
    
    而不是

  • 注意:未定义的偏移量:

    $f1 = $fields[10];
                   ^----- your array is not up to 10
    
因为您没有将生成的数据和所需的输出放在一起。我将假设您的最终输出并生成一些临时数据

$fields = array("ID","subID"); //You can Increase or decrease this Fields
$fieldCounts = count($fields);
$data = array(); // there is sql querieed data

for($i = 0; $i < 3; $i ++) {
    $data[] = array("ID" => mt_rand(1, 1000),"subID" => "sub" . mt_rand(100, 900));
}
输出

Array
(
    [159] => Array
        (
            [subID] => Array  <----------- SubID is fixed in your can cause confict
                (
                    [0] => Array
                        (
                            [ID] => 159
                            [subID] => sub589
                        )

                )

        )

    [334] => Array
        (
            [subID] => Array
                (
                    [0] => Array
                        (
                            [ID] => 334
                            [subID] => sub703
                        )

                )

        )

)
Array
(
    [159] => Array
        (
            [sub589] => Array <---------- Make Sub ID Dynamic 
                (
                    [0] => Array
                        (
                            [ID] => 159
                            [subID] => sub589
                        )

                )

        )

    [334] => Array
        (
            [sub703] => Array
                (
                    [0] => Array
                        (
                            [ID] => 334
                            [subID] => sub703
                        )

                )

        )

)
Array
(
    [159] => Array
        (
            [sub589] => Array <---- Easy to asses as $parsedData['159']['sub589']
                (
                    [ID] => 159
                    [subID] => sub589
                )

        )

    [334] => Array
        (
            [sub703] => Array
                (
                    [ID] => 334
                    [subID] => sub703
                )

        )

)
输出

Array
(
    [159] => Array
        (
            [subID] => Array  <----------- SubID is fixed in your can cause confict
                (
                    [0] => Array
                        (
                            [ID] => 159
                            [subID] => sub589
                        )

                )

        )

    [334] => Array
        (
            [subID] => Array
                (
                    [0] => Array
                        (
                            [ID] => 334
                            [subID] => sub703
                        )

                )

        )

)
Array
(
    [159] => Array
        (
            [sub589] => Array <---------- Make Sub ID Dynamic 
                (
                    [0] => Array
                        (
                            [ID] => 159
                            [subID] => sub589
                        )

                )

        )

    [334] => Array
        (
            [sub703] => Array
                (
                    [0] => Array
                        (
                            [ID] => 334
                            [subID] => sub703
                        )

                )

        )

)
Array
(
    [159] => Array
        (
            [sub589] => Array <---- Easy to asses as $parsedData['159']['sub589']
                (
                    [ID] => 159
                    [subID] => sub589
                )

        )

    [334] => Array
        (
            [sub703] => Array
                (
                    [ID] => 334
                    [subID] => sub703
                )

        )

)
输出

Array
(
    [159] => Array
        (
            [subID] => Array  <----------- SubID is fixed in your can cause confict
                (
                    [0] => Array
                        (
                            [ID] => 159
                            [subID] => sub589
                        )

                )

        )

    [334] => Array
        (
            [subID] => Array
                (
                    [0] => Array
                        (
                            [ID] => 334
                            [subID] => sub703
                        )

                )

        )

)
Array
(
    [159] => Array
        (
            [sub589] => Array <---------- Make Sub ID Dynamic 
                (
                    [0] => Array
                        (
                            [ID] => 159
                            [subID] => sub589
                        )

                )

        )

    [334] => Array
        (
            [sub703] => Array
                (
                    [0] => Array
                        (
                            [ID] => 334
                            [subID] => sub703
                        )

                )

        )

)
Array
(
    [159] => Array
        (
            [sub589] => Array <---- Easy to asses as $parsedData['159']['sub589']
                (
                    [ID] => 159
                    [subID] => sub589
                )

        )

    [334] => Array
        (
            [sub703] => Array
                (
                    [ID] => 334
                    [subID] => sub703
                )

        )

)
数组
(
[159]=>阵列
(
[sub589]=>阵列159
[subID]=>sub589
)
)
[334]=>阵列
(
[sub703]=>阵列
(
[ID]=>334
[subID]=>sub703
)
)
)

Related:@Infira请提供一些示例结果集数据来改进此问题。当我们更好地了解您的输入数据和所需的输出时,志愿者可以更好地回答,研究人员也可以更好地理解您的问题(并可能对其进行投票)。相关:@Infira请通过提供一些示例结果集数据来改进此问题。当我们更好地理解你的输入数据和你想要的输出时,志愿者可以更好地回答,研究人员可以更好地理解你的问题(并可能对其进行投票)。