使用另一个数组的相同顺序对数组进行排序

6
我有两个数组,包含起始德州扑克手牌。
其中一个由无序值组成。
$array1 = array("65s","AA","J9s","AA","32s");
//the cards can be repeated here as you see there are 2 "AA"

另一个应该用作第一个数组排序模型的数组:

$array_sorted = array("AA","KK","AKs"...);
//here the cards are not repeated

我希望重新排列 $array1,使用 $array_sorted 中使用的排序方法,
它应该返回一个类似于以下的数组:
$array1 = array("AA","AA","J9s","65s","32s");

我完全不知道如何完成这个任务。也许可以使用一些“用户定义的排序方法”?真的不知道。

我不确定我理解了。你只是想要一个asort吗?http://us2.php.net/manual/en/function.asort.php - MetalFrog
我觉得asort()不适用于这种情况,我需要根据$array_sorted中的顺序来对$array1进行排序。 - Giorgio
啊,明白了,你需要使用usort。http://us2.php.net/usort - MetalFrog
1个回答

8
你说得对,usort 是你要找的“用户定义排序方法”。下面这段代码应该适合你:

PHP >= 5.3

// Firstly this will be faster if the hands are the keys in the array instead
// of the values so we'll flip them with array_flip.
$array_sorted = array_flip( array( 'AA', 'KK', 'AKs', /* ... */ ) );
// => array( 'AA' => 0, 'KK' => 1, 'AKs' => 2, ... )

// your hands
$array1 = array( '65s', 'AA', 'J9s', 'AA', '32s' );

$array1_sorted = usort(
  $array1,

  // The comparison function 
  function($a, $b) {
    // If $a is AA and $b is J9s then
    // $array_sorted[ 'AA' ] - $array_sorted[ 'J9s' ]
    // will evaluate to a negative number, telling PHP that $a (AA)
    // is "smaller" than $b (J9s) and so goes first.
    return $array_sorted[ $a ] - $array_sorted[ $b ];
  }
);

PHP版本小于5.3

function sorting_function($a, $b){
  $array_sorted = array_flip( array( 'AA', 'KK', 'AKs', /* ... */ ) );

  return $array_sorted[ $a ] - $array_sorted[ $b ];
}

$array1 = array( '65s', 'AA', 'J9s', 'AA', '32s' );

$array1_sorted = usort( $array1, 'sorting_function' );

我正在测试它,但由于我将其用作类的方法,因此返回以下错误: Parse error: syntax error, unexpected T_FUNCTION in /Applications/MAMP/www/class2.php on line 1312 - Giorgio
你正在运行哪个版本的PHP? - afuzzyllama
1
您的版本不支持匿名函数,请在 usort() 之外声明函数,然后像这样调用它:usort($array1, "function_name") - afuzzyllama
这是一个作用域问题。$array_sortedsorting_function 的作用域内不存在。我正在尝试想出最好的解决方法。 - Jordan Running
1
我已经编辑过了,将$array_sorted移入到sorting_function中。我认为这样做没有什么大的缺点。如果这是我的项目,我可能会围绕它构建一个类,并将$array_sorted保留为静态变量,但这可能对你的项目来说有些过度设计。 - Jordan Running
谢谢!我已经解决了,$array_sorted里有一个问题;你的代码完美运行。;-) - Giorgio

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