尝试创建基本函数以使用 usort 对数组进行排序

Try to create basic function to sort array with usort

我正在尝试创建一个简单的函数来使用 usort 对数组进行排序,但我不明白我的代码有什么问题。

为了测试,我想按字段 'str' 按 "descending" 顺序排序。

我的测试数组:

$tabCustom = array(
    0 => array(
        'str' => 'cccc',
        'nb' => 1
    ),
    1 => array(
        'str' => 'aaaa',
        'nb' => 3
    ),
    2 => array(
        'str' => 'bbb',
        'nb' => 2
    )
);

这里是在没有自定义函数的情况下运行良好的代码:

usort($tabCustom, function($a, $b)
{
    $order = 'desc';
    if($order == 'asc')
    {
        return strcasecmp($a['str'], $b['str']);
    }
    elseif($order == 'desc')
    {
        return strcasecmp($b['str'], $a['str']);
    }
});

结果:

Array
(
    [0] => Array
        (
            [str] => cccc
            [nb] => 1
        )

    [1] => Array
        (
            [str] => bbb
            [nb] => 2
        )

    [2] => Array
        (
            [str] => aaaa
            [nb] => 3
        )

)

现在我尝试基于相同的代码构建自定义函数:

function arraySort($array, $field, $order = 'asc')
{
    usort($array, function($a, $b)
    {
        global $field;
        global $order;
        if($order == 'asc')
        {
            return strcasecmp($a[$field], $b[$field]);
        }
        elseif($order == 'desc')
        {
            return strcasecmp($b[$field], $a[$field]);
        }
    });
}
arraySort($tabCustom, 'str', 'desc');

错误的结果:

Array
(
    [0] => Array
        (
            [str] => cccc
            [nb] => 1
        )

    [1] => Array
        (
            [str] => bbb
            [nb] => 2
        )

    [2] => Array
        (
            [str] => aaaa
            [nb] => 3
        )

)

所以我不明白哪里出了问题,我已经为 $field$ 设置了 global 变量order 因为否则代码显示 Undefined variable,但我的 table 排序不起作用。

你对这个问题有想法吗?

谢谢:)

<?php

function a($foo) {
    b();
}

function b() {
    global $foo;
    var_dump($foo);
}

a('bar');

输出:

NULL

$foo 不在全局范围内。

您可以使用 'use' 从父作用域继承变量:

usort($array, function($a, $b) use ($field, $order) {
  // Your code here.
});

Progrock 是对的 - 你必须在这里使用 use... 另一个问题是——如果你定义了一个自定义函数——你必须使用一个引用数组。 Usort 已经自动完成了,但你必须在你自己的函数中定义它(& 运算符是这种情况的魔法键)。

以下应该有效:

function arraySort(&$array, $field, $order = 'asc')
{
    usort($array, function($a, $b) use ($field, $order)
    {
        return ($order == 'desc')   ?   strcasecmp($b[$field], $a[$field])  :   strcasecmp($a[$field], $b[$field]);
    });
}
arraySort($tabCustom, 'str', 'asc');