Php 将城市、州和国家分组
我是PHP新手,为此访问了几个网站,但似乎不能完全理解 我有一个疑问:Php 将城市、州和国家分组,php,mysql,multidimensional-array,group-by,Php,Mysql,Multidimensional Array,Group By,我是PHP新手,为此访问了几个网站,但似乎不能完全理解 我有一个疑问: $result = mysql_query ("SELECT Country, State, City FROM Address_Base ORDER BY Country, State, City") or die(mysql_error()); 这提供了以下数据示例: 加拿大-州1-苹果城 加拿大-州2-城市葡萄 加拿大-州1-苹果城 加拿大-州2-城市咖啡 美国-州1-城市斑马 美
$result = mysql_query
("SELECT Country, State, City
FROM Address_Base
ORDER BY Country, State, City")
or die(mysql_error());
这提供了以下数据示例:
加拿大-州1-苹果城
加拿大-州2-城市葡萄
加拿大-州1-苹果城
加拿大-州2-城市咖啡
美国-州1-城市斑马
美国-州2-城市猫
美国-州2-城市狮子
美国-州3-城市鸟
美国-州1-城市斑马
我的目标是将各个州的城市分组,计算城市数,将各个州分组,将相似的国家分组,并制作类似的产品
Canada -
{
State 1 - City Apple (2)
State 2 - City Coffee (1), City Grapes (1)
}
USA -
{
State 1 - City Zebra (2)
State 2 - City Cat (1), City Lion (1)
State 3 - City Bird (1)
}
从其他网站上,我得到了以下信息:
$combinedResults = array();
while ($rec=mysql_fetch_assoc($result))
{
$combinedResults[$rec['Country']][] = array
(
'S' => $rec['State'],
'C' => $rec['City']
);
}
foreach(array_keys($combinedResults) as $Country)
{
echo '<div class="country">'.$Country.'</div>';
foreach($combinedResults[$Country] as $Set)
{
echo $Set['S'].'<br/>'.$Set['C'].'<br/><br/>';
}
}
$combinedResults=array();
而($rec=mysql\u fetch\u assoc($result))
{
$combinedResults[$rec['Country']][]=数组
(
'S'=>$rec['State'],
'C'=>$rec['City']
);
}
foreach(数组_键($combinedResults)作为$Country)
{
回声“.$Country.”;
foreach($combinedResults[$Country]作为$Set)
{
回显$Set['S'].
.$Set['C'].
;
}
}
这只对相似的国家进行分组,而不是州和城市。我猜上面的代码是试图在某种多维数组中预处理数据,并使用for循环显示结果。我不能清楚地理解它
如果有人能为我解释一下,以及我如何按照上面的要求对各州和城市进行进一步分组,我将不胜感激。SQL查询将为您提供一组具有固定列数的结果。您的示例具有可变的列数(多个城市计数),因此这不起作用 您可以在SQL中使用COUNT和GROUP BY
Country State Citiescount
Canada state1 4
Canada state2 3
USA state2 2
$countries = array();
foreach ($results as $row) {
if (!isset($countries[$row->country])) {
$countries[$row->country] = array();
}
$countries[$row->country][$row->state] = $row->citiescount;
}
等等,但在左侧列中有重复项
要消除重复项,请在其上循环以生成一个多维数组,如下所示
Country State Citiescount
Canada state1 4
Canada state2 3
USA state2 2
$countries = array();
foreach ($results as $row) {
if (!isset($countries[$row->country])) {
$countries[$row->country] = array();
}
$countries[$row->country][$row->state] = $row->citiescount;
}
或者,您也可以只回显这些内容。您可以像这样一次性获得所有结果并在整个集合上循环,也可以将其分解为更小的查询,并在每个国家或每个州执行一个查询。但是,请注意,将SQL放入循环会杀死小猫(和数据库性能):。@Shef。。。。。请详细说明这一行:$countries[$row['Country'][$row['State'][$row['City']]]+=1--@Tede:它为城市保留了一个计数器。如果存在具有城市名称的数组索引,则计数器将增加1,否则计数器将以1开头。Shef…感谢您的回答…当我使用此行时:$countries[$row['Country'][$row['State']][$row['city']]+=1…它给我一个错误:“未定义的索引”。除去增量“+”,我可以实现我的所有目标,除了一个州内相同城市的数量。我发现另一件有趣的事情是您为动态多维数组创建编写代码的方式。我很高兴看到它,但我无法理解它。我在网上搜索了很多次,但没有多少。我要看哪本书,或者你能找点时间给我解释一下吗?@Tede:
未定义索引
不是错误,只是警告,忽略它。我根据数据库的列构建了多维数组。你可以读到。或者你可以用谷歌搜索。如果有一行代码您很难理解,请告诉我。我已经阅读了有关数组的内容,我知道我们使用“=>”来定义键和值…但是当我们使用这行代码时$国家[$row['Country'][$row['State'][$row['City']]]+=1;我觉得很难理解,这就是为什么我问…你能解释一下这句话吗?@Matt…我试过group by…因为它与聚合函数一起使用…对实现我的目标显示没有多大帮助。此外,在美国,两个城市可以有相同的名字,但不同的州……我试着按邮政编码分组……但我发现在墨西哥,我们的邮政编码可以是相同的。这给我带来了一个问题。因此,我删除了route.groupby,只要您以正确的顺序获取子句并包含所有子句,它就不会导致重复值的问题。在上面的例子中,我把国家放在第一位,这样你就可以按国家分组,然后按国家内的州分组(每个州一行,即使名称相同,只要它们在不同的国家)。我有点搞不懂你到底在算什么。城市名称后括号中的数字表示什么?城市名称后括号中的数字表示该州列出的同一城市的总数。例如:-在上述样本城市中,“苹果”在同一城市下出现两次,因此-(2)。这就是我正在计算的。