对一个数组进行排序并返回已排序的数组的函数

23

PHP的本地排序函数会通过引用进行修改,并且不会返回排序后的数组。

我正在寻找一种可靠的标准方法来对数组进行排序,并将排序后的数组作为返回值返回。

我阅读过的所有PHP.net函数都返回布尔值或0-1。

我需要的方法应该是这样的:

$some_mixed_array = array( 998, 6, 430 );
function custom_sort( $array )
{ 
  // Sort it
  // return sorted array
}

custom_sort( $some_mixed_array );

// returning: array( 6, 430, 998 )

无需处理字符串,只需处理整数。


为什么不使用PHP函数对数组的副本进行排序并返回结果呢? - Aneri
原始数组是否可以被修改或应该保持不变?如果不能,function custom_sort($a) { sort($a); return $a; } - knittl
1
你是指“short”还是“sort”?在你的代码中,你有“short”。 - Jakub
2
虽然排序函数返回一个布尔值,但它们仍然可以对数组进行排序 - 那么你试图解决什么问题呢? - Eike Pierstorff
9
为什么会有那么多踩?!这似乎是个很好的问题,但已经有一个简洁明了的答案了。关于这个问题,你可以看到这样一行代码:assert(sort(array_keys($myData)) == array('x','y')),但它会报错:"Only variables should be passed by reference"。 - Darren Cook
显示剩余2条评论
4个回答

13

这里是一个一行代码:

call_user_func(function(array $a){asort($a);return $a;}, $some_mixed_array);

这行代码调用了一个匿名函数,该函数将传入的数组按照键值升序排序并返回。函数参数需要为一个数组。

5

你能够做到这个吗?

这段内容与IT技术无关。
$some_mixed_array = array( 998, 6, 430 );
function custom_sort( $array )
{
  // Sort it
  asort($array);

  // return sorted array
  return $array;
}

custom_sort( $some_mixed_array );

// returning: array( 6, 430, 998 )

这也可以解决您的问题:
$some_mixed_array = array( 998, 6, 430 );
echo '<pre>'.print_r($some_mixed_array, true).'</pre>';

asort($some_mixed_array); // <- BAM!

// returning: array( 6, 430, 998 )
echo '<pre>'.print_r($some_mixed_array, true).'</pre>';

4
你应该警告说这两个解决方案有着不同的作用。第一个方法不会改变原始数组,而第二个则会改变。此外,在数字索引数组上使用 asort 很奇怪。虽然它保留了原始键,但你无法自然地迭代它。它失去了纯数组的本质。 - Robo Robok
sorted 是 Python 使用的函数名称。 - Jonathan

4

正如其他人所说,你最好创建一个自定义函数。然而,为了保持对PHP未来的灵活性,我建议使用可变参数函数。本质上,你将函数设置为接受传递给它的任何参数,并将它们传递给实际的sort()函数。通过这种方式完成,即使标准函数的可选参数在未来发生更改,你仍然可以使用它们。

function mysort( ...$params ) {
    sort( ...$params );
    return $params[0];
}

更新:相同的功能,但更易理解:

function mysort( $array, ...$params ) {
    sort( $array, ...$params );
    return $array;
}

0
从PHP7开始,如果你喜欢一行代码,你可以直接在闭包(匿名函数)后面附加你的输入数组。这不会改变原始数组,而是返回原始数组的副本的变异版本。
代码:(演示)
$some_mixed_array = [998, 6, 430];

var_export(
    (function($v) { sort($v); return $v; })($some_mixed_array)
);
  • (function($v) { sort($v); return $v; }) 是闭包。
  • ($some_mixed_array) 是函数签名中的单个参数。

sort() 在排序后不会保留数组的键。
asort() 在排序后将保留数组的键。


如果你喜欢简洁,并且不介意使用三元条件运算符,那么你可以尝试 PHP 的箭头函数语法。(演示

var_export(
    (fn($v) => sort($v) ? $v : $v)($some_mixed_array)
);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接