【问题标题】:PHP String Contains IntegerPHP字符串包含整数
【发布时间】:2013-06-24 12:23:39
【问题描述】:

我有以下字符串:

1BG200,1M400,1BA1000

我想将上面的字符串与 Desc Order 进行比较...

代码:

$sql = "SELECT * FROM collected WHERE c_no BETWEEN '".$from."' AND '".$to."' ORDER BY c_no Desc";

输出:

1M400
1BG200
1BA1000 

应该是 1000 更大,然后是 400、200..我如何比较它们?我认为比较包含整数的字符串是不对的!而且我找不到适合我的问题的正确解决方案?

有些人建议使用preg_matchsubstr..但是你可以看到有单字符和双字符ex( M 和 BG )。

对不起,我对 PHP 不是很熟悉。请帮忙!

【问题讨论】:

  • 那么,排序算法的唯一依赖部分是结束数字序列?
  • @Daniel 好吧,我想比较完整的字符串,但它似乎不适用于我。所以是的,我想忽略字母并排序数字序列。

标签: php mysql


【解决方案1】:

您可以使用自定义排序,只查看数字部分

function cmp($a, $b)
{
    $numa = intval(preg_replace('/[0-9]*[A-Z]+/', '', $a));
    $numb = intval(preg_replace('/[0-9]*[A-Z]+/', '', $b));
    if($a == $b) return 0;
    return ($a < $b) ? -1 : 1;
}

//Now get the list and sort
usort($list, "cmp");

【讨论】:

  • 此外,如果您希望前导数字也成为排序算法的一部分,您可以将模式交换为 "/[^0-9]/",这将基于所有数字进行排序。
【解决方案2】:

您可以使用preg_replace('/[0-9][A-Z]+/', '', $var) 删除第一个数字,然后再删除一个字母,然后使用php usort

【讨论】:

    【解决方案3】:

    您可以向 MySQL 添加自定义函数。找到一个看起来可以去掉所有非数字字符MySQL strip non-numeric characters to compare

    如果您因为返回的结果较大而决定使用限制/偏移量,我强烈建议您这样做,而不是将所有内容带回 php 并进行排序。否则,您将不得不将所有内容都拉回 PHP,然后拼接一个数组,此时我觉得这将是对资源的低效使用。

    或者,如果这是一个可行的选项,您可以在表中添加一个排序列,以便您更好地利用 MySQL 中的索引,这取决于您的记录集可能会产生巨大的性能差异。

    【讨论】:

      【解决方案4】:

      您可以将用户定义的 preg 函数添加到您的 mysql (https://github.com/mysqludf/lib_mysqludf_preg)。 然后在 order by 子句中使用 PREG_CAPTURE。

      【讨论】:

        【解决方案5】:

        一般来说,preg 很贵。为了从给定的模式中获得一个数字,我会这样做:

        digitstri='1M400'; // just an example
        number=intval(is_number(digitstri{2})?substr(digitstri,2):substr(digitstri,3))
        

        我认为,从那里的排序很清楚......

        【讨论】:

          猜你喜欢
          • 2018-02-20
          • 1970-01-01
          • 2011-03-23
          • 2015-02-08
          • 1970-01-01
          • 1970-01-01
          • 2012-11-14
          • 2017-06-21
          相关资源
          最近更新 更多