【问题标题】:Sorting Array by an added variable按添加的变量对数组进行排序
【发布时间】:2014-02-28 18:47:58
【问题描述】:

在 mysql 查询的末尾添加一个变量。 现在我需要能够按关联值排序。有人可以帮忙吗?我尝试了几种不同的排序方法。

$result2 = mysqli_query($datacon,
    "SELECT * FROM spreadsheet 
        WHERE brand = '$brand' 
            AND package = '$package' 
            AND HIDE_FROM_SEARCH = '0' 
        GROUP BY ACCTNAME $pages->limit");

echo mysqli_error($datacon);
while($row = mysqli_fetch_array($result2)) {
    $lat_B=$row['LATITUDE'];
    $long_B=$row['LONGITUDE'];

    $lat_A = round($lat_A,2);
    $long_A = round($long_A,2);
    $lat_B = round($lat_B,2);
    $long_B = round($long_B,2);
    $distance = new calcDist($lat_A, $long_A, $lat_B, $long_B);
    $distance = $distance->calcDist($lat_A, $long_A, $lat_B, $long_B);
    $distance = round($distance,2);
    $locationSort=array($row);
    $locationSort['distance']=$distance;

    FOR EACH SOMETHING?
}

我已经修改了我之前的帖子以反映我对答案的使用。

$result2 = mysqli_query($datacon,"SELECT * FROM spreadsheet WHERE brand = '$brand'
                AND package = '$package' and HIDE_FROM_SEARCH = '0' GROUP BY ACCTNAME $pages->limit");

                echo(mysqli_error($datacon));
                class sortBydistance
                {
                    function sortBydistance($a, $b) {
                        if ($a['distance'] == $b['distance']) {
                            return 0;
                        }
                        return ($a['distance'] < $b['distance']) ? -1 : 1;
                    }
                }
                while($row = mysqli_fetch_array($result2))
                {
                        $lat_B=$row['LATITUDE'];
                        $long_B=$row['LONGITUDE'];

                    $lat_A = round($lat_A,2);
                    $long_A = round($long_A,2);
                    $lat_B = round($lat_B,2);
                    $long_B = round($long_B,2);
                    $distance = new calcDist($lat_A, $long_A, $lat_B, $long_B);
                    $distance = $distance->calcDist($lat_A, $long_A, $lat_B, $long_B);
                    $distance = round($distance,2);


                }
                $locationSort=array($row);
                $locationSort['distance']=$distance;
                uasort($locationSort, array($this, "sortBydistance"));
                print_r($locationSort);

【问题讨论】:

  • 不清楚您希望在这里完成什么。你能扩展你的问题吗?
  • 基本上我从数据库中获取位置,然后在 while 循环中计算距离。我现在需要做的是将变量“距离”添加到数组中。然后按该数组内的距离排序。我已经能够将距离添加到数组中,但我无法让数组按距离排序。
  • 您可以为函数usort提供一个排序回调,它允许您根据距离值进行排序。
  • 我试过了,但我不明白如何具体按距离变量排序。
  • 警告:asort() 期望参数 2 很长,当我尝试这个时给出字符串:asort($locationSort, 'distance'); print_r($locationSort);

标签: php mysql arrays sorting


【解决方案1】:

在你的while 循环之后试试这个:

uasort($locationSort, 'sortBydistance');
// or uasort($locationSort, array($this, "sortBydistance")); if you are using withing a class
print_r($locationSort);

function sortBydistance($a, $b) {
    if ($a['distance'] == $b['distance']) {
        return 0;
    }
    return ($a['distance'] < $b['distance']) ? -1 : 1;
}

【讨论】:

  • 不清楚他需要uasort 而不是usort。他的原始数组不是关联的。
  • 是的,但使用关联用户排序也没有什么坏处。
  • 嗯,从性能的角度来看,这很痛苦,但我相信这是一个可以忽略不计的损失,所以我可以同意。
  • 警告:uasort() 期望参数 2 是有效的回调,未找到函数 'sortBydistance' 或无效的函数名称然后致命错误:无法重新声明 sortBydistance()(之前已声明
  • @RevoTech 这个错误应该很容易找出来。
【解决方案2】:

首先,创建条目数组,并将其存储在一个数组中,我们将调用$rows

您想在此处使用 PHP 函数 usort 来提供自定义排序回调。

假设您有一个如下所示的数组:

$rows = array(
    array("latitude" => 5, "distance" => 10),
    array("latitude" => 10, "distance" => 5),
    array("latitude" => 56, "distance" => 48)
);

您希望 $rows 的数组被重新排序,以便 latitude == 10 的条目排在第一位,latitude == 5 排在第二位,latitude == 56 排在第三位,这取决于它们之间的距离。

usort($rows, function ($a, $b) {
    $a = $a['distance'];
    $b = $b['distance'];

    return $a == $b ? 0 : $a > $b ? 1 : -1;
});

输出

Array
(
    [0] => Array
        (
            [latitude] => 10
            [distance] => 5
        )

    [1] => Array
        (
            [latitude] => 5
            [distance] => 10
        )

    [2] => Array
        (
            [latitude] => 56
            [distance] => 48
        )

)

See this demonstration at ideone.com


或者,您可以尝试找到一个 SortedArray 实现,该实现将使元素在插入数组时保持排序,而不是仅当您在数组上调用 usort() 时。不过,这对于这个问题来说有点太高级了。

【讨论】:

  • 此实例是否适用于复杂数组?我的初始查询吐出大约 15-20 个变量,并且距离修改了该数组。我用这个例子替换了我的分类代码,它消除了错误,但似乎没有排序。
  • 您能否向我们展示您的数组示例,使用print_r($myArray); 以便我们查看其结构?
【解决方案3】:

可能您没有正确检索 $bran 和 $package 变量..

$result2 = mysqli_query($datacon,
    "SELECT * FROM spreadsheet 
        WHERE brand = '".$brand."' 
            AND package = '".$package."' 
            AND HIDE_FROM_SEARCH = '0' 
        GROUP BY ACCTNAME ".$pages->limit.");

【讨论】:

  • 查询运行良好,无需计算距离。我的问题是我在 while 循环中按距离排序。最终我不得不将“距离”变量添加到数组中。现在我在对数组进行排序时遇到问题......使用距离变量。当我在排序之前打印数组时......距离变量就在那里。但我不明白如何排序...按新变量。
猜你喜欢
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 2020-04-01
  • 1970-01-01
  • 2014-05-08
相关资源
最近更新 更多