【问题标题】:Unexpected behavior with strnatcmp() PHPstrnatcmp() PHP 的意外行为
【发布时间】:2014-11-18 20:09:36
【问题描述】:

我正在尝试获取一个函数,以在 PHP 中从 A->ZZ 或 AAA -> ZZZ 向上递增 alpha,其中包含所有变化,即。 A、B、C...AA、AB、AC..ZX、ZY、ZZ 等。

以下代码有时有效,但在某些情况下会中断,此示例完美运行。

$from = "A";
$to = "ZZ";

while(strnatcmp($from, $to) <= 0) {           
    echo $from++;
}

虽然这没有按预期工作。

$from = "A";
$to = "BB";

while(strnatcmp($from, $to) <= 0) {
    echo $from++;
}

输出是:

First: A B C D .. AA AB AC .. ZX ZY ZZ
Second: A B

有人知道这里发生了什么吗?或者可能是解决我的问题的不同方法。 谢谢

【问题讨论】:

  • 你期望什么输出?
  • 和第一个例子一样,中间的所有变化。 A、B、C...AA、AB、AC...BA、BB
  • 我猜它是在说 B == BB 但这没有意义吧?
  • 很好的例子。我刚刚用标准的while ($from !== $to) echo $from++; 尝试了同样的事情并看到了同样的结果。 注意: 严格比较在这里没有区别。
  • @NexxTea 它停在C ... strnatcmp('C', 'BB') = 1 因为C 大于BB

标签: php auto-increment behavior


【解决方案1】:

这行得通,但它在BA 上停止......所以你可以说$to = 'BC'; 或者你可以在你声明$to 之后立即加入$to++;

$from= 'A';
$to = 'BB';
while ($from !== $to) {
    echo $from++;
}

$from= 'A';
$to = 'BB';
$to++;
while ($from !== $to) {
    echo $from++;
}

如果您使用的是 PHP 5.5,则可以使用生成器。

function alphaRange($from, $to) {
    ++$to;
    for ($i = $from; $i !== $to; ++$i) {
        yield $i;
    }
}

foreach (alphaRange('A', 'BB') as $char) {
    echo $char;
}

【讨论】:

    【解决方案2】:

    这应该适合你:

    <?php
    
        $from = "AA";
        $to = "BB";
    
        while(strnatcmp($from, $to) <= 0)           
            echo $from++ . "<br />";
    
    ?>
    

    输出是:

    AA...BB
    

    如果你也想要字母表,那么在上面的代码之前复制这个:

    $from = "A";
    $to = "Z";
    
    while(strnatcmp($from, $to) <= 0)           
        echo $from++ . "<br />";
    

    【讨论】:

    • 用户的输入将是 A 和 ZZZZZ 之间的任何东西,我需要能够生成两个输入之间的所有组合。比如说 AZT 和 ZPTSR
    猜你喜欢
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多