【问题标题】:Try to create basic function to sort array with usort尝试创建使用 usort 对数组进行排序的基本函数
【发布时间】:2019-10-11 10:14:10
【问题描述】:

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

对于测试,我想按“降”顺序按字段“str”排序。

我的测试数组:

$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$order 放置了 global 变量,否则代码会说Undefined variable,但是我的表格排序不起作用。

你对这个问题有什么想法吗?

谢谢:)

【问题讨论】:

  • 作为注释(而不是解决方案):永远不要使用 9/10 全局变量,而是传入参数
  • 好的,谢谢,以后我会尽量不使用“global”

标签: php function usort


【解决方案1】:

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');

【讨论】:

  • 感谢您的回答和脚本,我现在更好地理解了我的错误,如果我理解“&”,我不知道“use”和“&”运算符的用法允许在我的函数中使用“$tabCustom”而不使用“return $array”(如副本)?
  • 是的,类似的东西-官方文档中有一个写得很好的观点-看看@secure.php.net/manual/en/language.references.pass.php-请帮我一个忙-接受并投票赞成progrock或我的答案。 ..(如果有人为您提供解决方案,这就是 SO 的工作方式)
【解决方案2】:
<?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.
});

【讨论】:

  • 引用在他自己的函数function arraySort(&amp;array...也是missig@
  • @sintakonte 好点!如果没有引用,排序会在副本上进行,原始数组不会受到影响。
  • 感谢您的回答,我不知道“use”用于函数的用法,所以我尝试使用“global”,谢谢
猜你喜欢
  • 1970-01-01
  • 2012-01-29
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
  • 2013-02-08
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多