尝试创建基本函数以使用 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');
我正在尝试创建一个简单的函数来使用 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');