Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将城市、州和国家分组_Php_Mysql_Multidimensional Array_Group By - Fatal编程技术网

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-城市斑马 美

我是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-城市斑马

美国-州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)。这就是我正在计算的。