【问题标题】:PHP Sorting array alphabetically and numericallyPHP按字母和数字排序数组
【发布时间】:2021-05-03 11:16:39
【问题描述】:

假设我有一系列 iPhone 型号 ['iPhone 11', 'iPhone 5', 'iPhone XS', 'iPhone 12'] 需要按此平均排序 ['iPhone 12', 'iPhone 11', 'iPhone 5', 'iPhone XS']。我尝试的是使用本机排序(p.g.sort())函数或尝试从 DB 直接 orderBy,但所有解决方案都给了我这个输出['iPhone 11', 'iPhone 12', 'iPhone 5', 'iPhone XS']。有没有人有一些解决方案/想法应该怎么做?经过所有尝试后,我感到非常沮丧。

【问题讨论】:

  • 您的排序不是自动的。它不是字母或数字。你必须实现你的排序功能
  • 如果我理解正确的话,这可以概括为始终将数字模型放在第一位,然后是文本,ASC 和 DESC 控制数字/字母排序的顺序?

标签: php arrays sorting


【解决方案1】:

您需要usort function。例如,

function getPhoneModel($phoneName) {
  $regex = "/iPhone (.+)$/";
  preg_match($regex, $phoneName, $matches);
  $model = $matches[1];
  if ($model === 'XS') {
    $model = 1;
  }
  return intval($model);
}
    
$phones = ['iPhone 11', 'iPhone 5', 'iPhone XS', 'iPhone 12'];
usort($phones, function($phoneNameA, $phoneNameB) {

    $a = getPhoneModel($phoneNameA);
    $b = getPhoneModel($phoneNameB);
    if ($a > $b) {
        return (-1);
    } elseif ($a < $b) {
        return 1;
    } else {
        return 0;
    }
});

print_r($phones);

这将导致

Array
(
    [0] => iPhone 12
    [1] => iPhone 11
    [2] => iPhone 5
    [3] => iPhone XS
)

【讨论】:

  • 这很好,只要XS 是唯一可能的文本模型。如果SE 输入组合,您的算法将不再有效。
  • @El_Vanja 我认为作者可能希望手动定义排序字母模型的规则。也许到发布年份。在那种情况下,我的方法会更合适。无论如何,这取决于作者,我们给了他他需要的所有信息:)
【解决方案2】:

任务描述不够准确。

我认为它比@El_Vanja 的评论更复杂。我试图具体一点。

  • 模型具有模型名称和类型,以空格分隔。
  • 型号名称(此处仅 iPhone)应按字母顺序排序 升序。
  • 数字类型 11 如何优先于字母 XS。
  • 如果类型为数字,则顺序为降序。
  • 在另一种情况下,类型按升序排序。

为了这个任务,我扩展了示例数组。

$in = ['ax A', 'iPhone 11', 'iPhone 5', 'iPhone XS', 'iPhone 12', 'master 6', 'ax Z', 'ax B','xphone'];

解决方案是使用 usort 和一个特殊的排序功能。

function specialSort($a,$b){
  list($aModel,$aTyp) = explode(' ',$a.' ');
  list($bModel,$bTyp) = explode(' ',$b.' ');

  return $aModel <=> $bModel
   ?: (int)$bTyp <=> (int)$aTyp
   ?: $aTyp      <=> $bTyp
  ;
}

usort($in,'specialSort')

测试输出:

echo implode(' | ',$in);
//ax A | ax B | ax Z | iPhone 12 | iPhone 11 | iPhone 5 | iPhone XS | master 6 | xphone

【讨论】:

    【解决方案3】:

    你有没有尝试过用户

    array_multisort($array, SORT_NATURAL);
    

    https://www.php.net/manual/en/function.array-multisort.php

    【讨论】:

    • 哦,谢谢。我还没有尝试过这种简单性。但是还有一件事,是否可以使用某些本机功能以相反的顺序对其进行排序?我的意思是从 12 到更低的型号,然后是 XS 等。
    • 这与问题有什么关系?没有提到多个数组或多维数组的示例。
    猜你喜欢
    • 2013-03-18
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多