PHP:数组int比较错误?

时间:2015-05-18 07:02:43

标签: php arrays int compare

我不知道为什么我无法获得预期的结果。 结果显示2> 10> 1但我想要10> 2> 1 谁能帮我?感谢

<?
function reorder($a, $b)
    {
        $a = substr($a, strlen("a/"));
        $a = substr($a, 0, -strlen(".php"));
        $b = substr($b, strlen("a/"));
        $b = substr($b, 0, -strlen(".php"));
        switch ($a) {
            case "1m_microUSB_cable":
                $a['order'] = 1;
                break;
            case "25cm_microUSB_cable":
                $a['order'] = 2;
                break;
            case "30cm_lightning_cable":
                $a['order'] = 3;
                break;
            case "1.5m_lightning_cable":
                $a['order'] = 5;
                break;
            case "1m_lightning_cable":
                $a['order'] = 4;
                break;
            case "1m_microUSB_upgrade_cable":
                $a['order'] = 6;
                break;
            case "hand_ring_cable_Android":
                $a['order'] = 7;
                break;
            case "hand_ring_cable_Apple":
                $a['order'] = 8;
                break;
            case "Light_bulb_key_ring":
                $a['order'] = 9;
                break;
            case "candy_machine":
                $a['order'] = 10;
                break;
            default:
                $a['order'] = 999;
            }
        switch ($b) {
            case "1m_microUSB_cable":
                $b['order'] = 1;
                break;
            case "25cm_microUSB_cable":
                $b['order'] = 2;
                break;
            case "30cm_lightning_cable":
                $b['order'] = 3;
                break;
            case "1.5m_lightning_cable":
                $b['order'] = 5;
                break;
            case "1m_lightning_cable":
                $b['order'] = 4;
                break;
            case "1m_microUSB_upgrade_cable":
                $b['order'] = 6;
                break;
            case "hand_ring_cable_Android":
                $b['order'] = 7;
                break;
            case "hand_ring_cable_Apple":
                $b['order'] = 8;
                break;
            case "Light_bulb_key_ring":
                $b['order'] = 9;
                break;
            case "candy_machine":
                $b['order'] = 10;
                break;
            default:
                $b['order'] = 999;
            }

        if ($a['order'] == $b['order']) {
            return 0;
        } elseif ($a['order'] > $b['order']) {
            return -1;
        } else {
            return 1;
        }
    }
?>

我想重新排序数组,我使用

$glob = glob("a/*.php");
include ("reorder.php");
usort($glob, "reorder");
foreach ($glob as $filename) {
        include ($filename);
        include ("templates/a.php");
    }

$ glob的转储:

array ( 0 => 'a/Light_bulb_key_ring.php', 1 => 'a/hand_ring_cable_Apple.php', 2 => 'a/hand_ring_cable_Android.php', 3 => 'a/1m_microUSB_upgrade_cable.php', 4 => 'a/1.5m_lightning_cable.php', 5 => 'a/1m_lightning_cable.php', 6 => 'a/30cm_lightning_cable.php', 7 => 'a/25cm_microUSB_cable.php', 8 => 'a/candy_machine.php', 9 => 'a/1m_microUSB_cable.php', )

我从1到9重新排序数组是好的但是当订单10时,订单10将在订单1之后但不是订单9.我不知道为什么?我希望有一个人可以帮助我。谢谢! 抱歉我的英语不好。

我很抱歉,我打字不清楚。因此,我创建了一个图像。

现在订单: Image 1

预期订单: Image 2

3 个答案:

答案 0 :(得分:0)

给定的结果是词法顺序,而不是数字顺序。要强制数字顺序,请更改:

    $aNum = intval($a['order']);
    $bNum = intval($b['order']);

    return $bNum - $aNum;

答案 1 :(得分:0)

我不太了解你的排序功能逻辑。任何带有其他值的文件名,然后是&#34; test0&#34;,&#34; test1&#34;和&#34; test2&#34;将具有相同的最高顺序&#34; 999&#34;。

如果您的所有文件名都包含&#34; test&lt; [\ d] +&gt; .php&#34;格式然后您可以简单地提取该值并将其用于比较:

function reorder($a, $b)
{
    if (preg_match('|/a/test(\d+).php|', $a, $match)) {
        $a = (int) $match[1];
    } else {
        $a = 999; // Filename is in different format so place it at the end of the list         
    }
    if (preg_match('|/a/test(\d+).php|', $b, $match)) {
        $b = (int) $match[1];
    } else {            
        $b = 999;
    }

    return $a - $b;
}

$files = Array('/a/extra.php', '/a/test0.php', '/a/test1.php', '/a/test5.php', '/a/test10.php', '/a/test11.php', '/a/test100.php', '/a/test22.php',);
usort($files, 'reorder');
var_dump($files);

此输出:

array(8) {
  [0]=>
  string(12) "/a/test0.php"
  [1]=>
  string(12) "/a/test1.php"
  [2]=>
  string(12) "/a/test5.php"
  [3]=>
  string(13) "/a/test10.php"
  [4]=>
  string(13) "/a/test11.php"
  [5]=>
  string(13) "/a/test22.php"
  [6]=>
  string(14) "/a/test100.php"
  [7]=>
  string(11) "/a/extra.php"
}

答案 2 :(得分:0)

最后,我找到了答案。这是一个非常愚蠢的错误。

我想感谢所有在这里帮助我的人。谢谢!

$ a ['order']和$ b ['order']无法正常工作,因为$ a和$ b是字符串(含内容)。结果,$ a ['order']将改变字符串$ a的第一个字母(/ digit)。 ($ b同样的问题)

例如,如果$ a ['order'] = 2,$ a =“this_is_string”将被替换为$ a =“2his_is_string”。因此,如果$ a ['order'] = 10(任何两个或更多)数字),$ a将变为“1his_is_string”,顺序将为1但不是10.因此,发生了此错误。

要解决此问题,只需将所有$ a ['order']更改为$ a_order(或任何其他变量),将$ b ['order']更改为$ b_order(或任何其他变量)。

(抱歉我的英语不好)