【问题标题】:How to use array_rand() or shuffle() functions in php mysql如何在 php mysql 中使用 array_rand() 或 shuffle() 函数
【发布时间】:2016-05-26 16:55:12
【问题描述】:

我有以下工作代码来输出状态并输出每个州下的相关城市。但是,我想对每个州的城市进行洗牌或随机化。例如,如果州是加利福尼亚,那么我想将其下的相关输出城市随机化或随机化。我尝试为此使用不同的方法,例如 ORDER BY RAND()、implode() 等,但没有得到正确的结果。

    $get_result = "select DISTINCT state_name, city_name from country WHERE country_name='$select_country' ORDER BY state_name ASC";
    $result = array();
    $run = mysqli_query($dbconfig, $get_result);

    while ($row=mysqli_fetch_array($run)) {
        $state_name = $row['state_name'];
        $city_name = $row['city_name'];

        if (!isset($result[$state_name])) {
            echo '<p>' . $state_name . '</p>';
            $result[$state_name] = true;
        }

        echo '<p style="margin-left: 10px;"><a href="http://examplesite.com/'.$city_name.'">'. $city_name .'</a></p>';
     }

我们将不胜感激任何有关此事的帮助。

【问题讨论】:

  • 警告:当使用mysqli 时,您应该使用parameterized queriesbind_param 将用户数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了一个严重的SQL injection bug切勿$_POST$_GET 数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。
  • 为什么ORDER BY RAND() 得不到正确的结果?

标签: php mysql random shuffle


【解决方案1】:
//first you need to fetch all data
$states = array();
while ($row=mysqli_fetch_array($run)){
    $state_name = $row['state_name'];
    $city_name = $row['city_name'];
    $city_with_dashes = $row['city_name_with_dash']; 
    if (!isset($states[$state_name])) {
        $states[$state_name] = array(
            'name' => $state_name,
            'cities' => array()
        );
    }
    //add city to state
    $states[$state_name]['cities'][] = array(
        'name' => $city_name,
        'dashes' => $city_with_dashes
    );
}

//now you can iterate by this data
foreach ($states as $state) {
    echo '<p>' . $state['name'] . '</p>';
    //shuffle state cities
    shuffle($state['cities']);

    //and display cities
    foreach ($state['cities'] as $city) {
        echo '<p style="margin-left: 10px;"><a href="http://examplesite.com/'.$city['dashes'].'">'. $city['name'] .'</a></p>';            
    }
}

【讨论】:

  • 很好的答案,我试过你的代码,它可以工作。但是,我仍然有一个问题,那就是当我向城市链接 URL 添加不同的值时,所有城市 URL 都指向一个城市。例如,当我使用“.$city_with_dashes”时。如果此 URL 值中的变量,则所有输出城市链接仅指向一个城市:echo '

    examplesite.com/'.$city_with_dashes.'">'。 $城市。'

    ';我在 while 循环中声明了这个变量: $city_with_dashes = $row['city_name_with_dash'];我也在 MySQL SELECT 语句中包含了 city_name_with_dash。
  • 在这种情况下,您不仅要向城市数组添加名称,还要添加破折号。您可以通过数组来完成。我已经更新了我的回答代码,现在你需要什么(城市名称和城市名称带破折号):)
【解决方案2】:

添加 group_concat 函数更改您的查询,然后从城市数组中获取随机值

$get_result = "select state_name, 
                      group_concat(city_name) city_name
                 from country 
                 WHERE country_name='$select_country' 
                 group by state_name 
                 ORDER BY state_name ASC";

$result = array();
$run = mysqli_query($dbconfig, $get_result);
while ($row=mysqli_fetch_array($run)){
    $state_name = $row['state_name'];
    $city_names = shuffle(explode(',', $row['city_name']));
    echo '<p>' . $state_name . '</p>';
    foreach ($city_names as $city)
        echo '<p style="margin-left: 10px;">
              <a href="http://examplesite.com/'.$city_name.'">'.
              $city_name[array_rand($city_name)] .'</a></p>';

}

【讨论】:

  • 感谢您的回复。我试过你的代码,每个州只输出一个随机城市。如果我最初的问题不是那么清楚,我很抱歉。我想输出州下的所有相关城市并将它们随机化或随机化。例如:如果加利福尼亚有 25 个城市,我想在加利福尼亚下列出所有城市,并在每次刷新页面时对这些城市进行洗牌(将城市随机化以不具有相同的列表顺序)。
  • 代码要求最少的更改,因为 $city_names 已经包含所有城市的列表
猜你喜欢
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
相关资源
最近更新 更多