【问题标题】:Sort an array by using the same order of another one使用与另一个数组相同的顺序对数组进行排序
【发布时间】:2012-01-16 19:43:43
【问题描述】:

我有 2 个包含起始扑克手牌的数组。

一个由无序的值组成。

$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

我想用 $array_sorted 中使用的排序重新排序 $array1,

它应该返回一个像这样的数组:

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

我完全不知道如何做到这一点。也许通过使用一些“用户定义的排序方法”?真的不知道。

【问题讨论】:

标签: php arrays sorting


【解决方案1】:

您是对的,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

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

【讨论】:

  • 我正在测试它,但由于我将它用于类的方法中,它返回此错误:解析错误:语法错误,/Applications/MAMP/www/class2 中的意外 T_FUNCTION。第1312行的php
  • 你运行的是什么版本的 PHP?
  • 你的版本不支持匿名函数,在usort()之外声明函数并像这样调用usort($array1, "function_name")
  • 这是范围问题。 $array_sorted 不存在于sorting_function 的范围内。我正在考虑最好的解决方法。
  • 我已对其进行了编辑以将 $array_sorted 移动到 sorting_function。我不认为这有什么大的缺点。如果这是我的项目,我可能最终会围绕它构建一个类并将 $array_sorted 保留为静态变量,但这对您的项目来说可能是多余的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多