【问题标题】:php - sorting function does not sort indiciesphp - 排序功能不对索引进行排序
【发布时间】:2016-05-25 20:46:35
【问题描述】:

我正在使用以下函数对数组进行排序

function array_sort($array, $on, $order=SORT_ASC){

    $new_array = array();
    $sortable_array = array();

    if (count($array) > 0) {
        foreach ($array as $k => $v) {
            if (is_array($v)) {
                foreach ($v as $k2 => $v2) {
                    if ($k2 == $on) {
                        $sortable_array[$k] = $v2;
                    }
                }
            } else {
                $sortable_array[$k] = $v;
            }
        }

        switch ($order) {
            case SORT_ASC:
            asort($sortable_array);
            break;
            case SORT_DESC:
            arsort($sortable_array);
            break;
        }

        foreach ($sortable_array as $k => $v) {
            $new_array[$k] = $array[$k];
        }
    }
    return $new_array;
}

$prevnext = array_sort($prevnext, 'distance-between', SORT_ASC);

当我 var_dump(); 排序后的数组 ($prevnext) 时,我得到了预期的结果,但是当我 var_dump($prevnext[0]); 时,它并没有给我我想要的,而是排序之前的数据。

我误解了排序吗?有没有办法根据键的特定值重新排序数组。所以当我使用$prevnext[0] 时,我会得到重新排序的数据。任何帮助将不胜感激。

var_dump($prevnext); 给出下面的数组,使用距离键排序:

array(11) { [10]=> array(7) { [0]=> string(3) "284" ["c_service_id"]=> string(3) "284" [1]=> string(14) "McGill Buckley" ["service_name"]=> string(14) "McGill Buckley" [2]=> string(7) "K2B 6V2" ["service_zip"]=> string(7) "K2B 6V2" ["distance-between"]=> float(9.24) } [0]=> array(7) { [0]=> string(4) "1319" ["c_service_id"]=> string(4) "1319" [1]=> string(38) "MDS MacFarlane Data & Mailing Services" ["service_name"]=> string(38) "MDS MacFarlane Data & Mailing Services" [2]=> string(7) "K1B 3V9" ["service_zip"]=> string(7) "K1B 3V9" ["distance-between"]=> float(11.66) } [6]=> array(7) { [0]=> string(4) "1270" ["c_service_id"]=> string(4) "1270" [1]=> string(38) "MDS MacFarlane Data & Mailing Services" ["service_name"]=> string(38) "MDS MacFarlane Data & Mailing Services" [2]=> string(7) "K1B 3V9" ["service_zip"]=> string(7) "K1B 3V9" ["distance-between"]=> float(11.66) } [7]=> array(7) { [0]=> string(4) "1268" ["c_service_id"]=> string(4) "1268" [1]=> string(31) "Evoke Direct Response Solutions" ["service_name"]=> string(31) "Evoke Direct Response Solutions" [2]=> string(7) "K2M 1X5" ["service_zip"]=> string(7) "K2M 1X5" ["distance-between"]=> float(13.48) } [3]=> array(7) { [0]=> string(4) "1293" ["c_service_id"]=> string(4) "1293" [1]=> string(24) "Creative Signs & Designs" ["service_name"]=> string(24) "Creative Signs & Designs" [2]=> string(7) "K1Z 7S8" ["service_zip"]=> string(7) "K1Z 7S8" ["distance-between"]=> float(27.43) } [9]=> array(7) { [0]=> string(3) "289" ["c_service_id"]=> string(3) "289" [1]=> string(8) "seoplus+" ["service_name"]=> string(8) "seoplus+" [2]=> string(7) "K2B 1A5" ["service_zip"]=> string(7) "K2B 1A5" ["distance-between"]=> float(32.32) } [5]=> array(7) { [0]=> string(4) "1275" ["c_service_id"]=> string(4) "1275" [1]=> string(35) "Innovacom Marketing & Communication" ["service_name"]=> string(35) "Innovacom Marketing & Communication" [2]=> string(7) "K1M 1L5" ["service_zip"]=> string(7) "K1M 1L5" ["distance-between"]=> float(43.62) } [8]=> array(7) { [0]=> string(4) "1267" ["c_service_id"]=> string(4) "1267" [1]=> string(27) "Rideau Mailing Services Inc" ["service_name"]=> string(27) "Rideau Mailing Services Inc" [2]=> string(7) "K2E 7K1" ["service_zip"]=> string(7) "K2E 7K1" ["distance-between"]=> float(45.74) } [2]=> array(7) { [0]=> string(4) "1294" ["c_service_id"]=> string(4) "1294" [1]=> string(21) "Agent Signs & Designs" ["service_name"]=> string(21) "Agent Signs & Designs" [2]=> string(7) "K1Y 0T8" ["service_zip"]=> string(7) "K1Y 0T8" ["distance-between"]=> float(50.11) } [1]=> array(7) { [0]=> string(4) "1297" ["c_service_id"]=> string(4) "1297" [1]=> string(21) "Golden Triangle Signs" ["service_name"]=> string(21) "Golden Triangle Signs" [2]=> string(7) "K0A 1B0" ["service_zip"]=> string(7) "K0A 1B0" ["distance-between"]=> float(57.39) } [4]=> array(7) { [0]=> string(4) "1280" ["c_service_id"]=> string(4) "1280" [1]=> string(32) "Aditek Design Printing And Signs" ["service_name"]=> string(32) "Aditek Design Printing And Signs" [2]=> string(7) "K1G 3W3" ["service_zip"]=> string(7) "K1G 3W3" ["distance-between"]=> float(64.13) } }

但是当我使用$prevnext[0] 时,它不会给我与上面相同的结果。我明白了:

array(7) { [0]=> string(4) "1319" ["c_service_id"]=> string(4) "1319" [1]=> string(38) "MDS MacFarlane Data & Mailing Services" ["service_name"]=> string(38) "MDS MacFarlane Data & Mailing Services" [2]=> string(7) "K1B 3V9" ["service_zip"]=> string(7) "K1B 3V9" ["distance-between"]=> float(11.66) }

我应该去哪里:

array(7) { [0]=> string(3) "284" ["c_service_id"]=> string(3) "284" [1]=> string(14) "McGill Buckley" ["service_name"]=> string(14) "McGill Buckley" [2]=> string(7) "K2B 6V2" ["service_zip"]=> string(7) "K2B 6V2" ["distance-between"]=> float(9.24) }

上面的数组应该在var_dump($prevnext[0]);最先显示,因为它的间距最小。

【问题讨论】:

标签: php arrays sorting


【解决方案1】:

使用以下方法对数组索引进行排序

function sort_by_order ($a, $b)
{
    return $a['order'] - $b['order'];
}

usort($array, 'sort_by_order ');

【讨论】:

    猜你喜欢
    • 2013-11-29
    • 2011-12-17
    • 2011-01-26
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 2014-10-31
    相关资源
    最近更新 更多