在PHP中按多个字段动态分组数据
我想按字段对关联数组进行分组。数组本身最初来自mysql数据库查询 下面是我如何通过硬编码实现的示例:在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)
<?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请通过提供一些示例结果集数据来改进此问题。当我们更好地理解你的输入数据和你想要的输出时,志愿者可以更好地回答,研究人员可以更好地理解你的问题(并可能对其进行投票)。