PHP会根据空间的存在来使用不一致的结果

时间:2017-10-18 10:03:18

标签: php

按日期按日期对图像网格进行排序:

          function cmp($a, $b) {
             return $b['date'] - $a['date'];
          }
          usort($grid,"cmp");

我注意到它无法处理排序中的标点符号,因此对于我的日期值如下所示:2016:06:13 17:13:40,我将冒号删除:20160613 171340

然而,我注意到时间仍然有点随机,所以它显然无法处理空间。但是,删除空格后,我的数据以非常奇怪的方式排序。对带有和不带空格的结果进行排序。

使用:

20170825 133343
20160613 171340
20151219 153233
20150411 163251
20150411 170725
20120205 190136
20111208 180809
20111001 233800
20111001 222819
20110724 150029
20101110 223719
20100521 112853
20100521 114000
20100504 202257
20100327 112223
20100327 105112
20090816 212251
20090811 231741
20090725 131010
20090617 190555
20090607 182255
20090607 184101
20090607 185514
20090607 185111
20090607 184348
20090527 200636
20090527 203710
20090522 081743
20090522 083222
20090516 184018
20090516 143153
20090516 180547
20090411 103531
20090411 093849
20090411 101501
20090411 101119
20090326 232539
20090209 145905
20080710 120653
20080626 164258
20080217 171941
20070430 222423
20070418 155014
20070412 133327
20070224 123651
20070218 175937
20070202 183904
20070106 142425
20070106 160924
20061115 182508
20060731 020755
20060602 193725
20060602 195715
20060508 170734
20060508 171000
20060508 173855
20060430 165458
20060430 162952
20060408 175236
20060311 095114
20060305 084042
20060117 184836
20051120 164622
20051120 163444
20051120 182736
20050927 040755
20050614 153925
20050613 191608
20050416 063904
20050307 215826
20031115 213612
20030918 165424
20030916 190106

20111208180809
20050927040755
20111001233800
20111001222819
20080710120653
20050614153925
20050613191608
20110724150029
20170825133343
20080626164258
20050416063904
20050307215826
20080217171941
20101110223719
20100521114000
20100521112853
20100504202257
20070430222423
20160613171340
20070418155014
20070412133327
20100327112223
20100327105112
20070224123651
20070218175937
20070202183904
20070106160924
20070106142425
20031115213612
20061115182508
20151219153233
20030918165424
20030916190106
20090816212251
20090811231741
20060731020755
20090725131010
20060602195715
20060602193725
20090617190555
20090607185514
20090607185111
20090607184348
20090607184101
20090607182255
20060508173855
20060508171000
20060508170734
20090527203710
20090527200636
20090522083222
20090522081743
20090516184018
20090516180547
20090516143153
20060430165458
20060430162952
20060408175236
20090411103531
20090411101501
20090411101119
20090411093849
20060311095114
20060305084042
20090326232539
20150411170725
20150411163251
20090209145905
20060117184836
20120205190136
20051120182736
20051120164622
20051120163444

我无法理解为什么这会以这种方式影响排序。

2 个答案:

答案 0 :(得分:1)

您的比较函数减去两个字符串:

return $b['date'] - $a['date'];

arithmetic operators将运算符转换为数字以便能够使用它们。 conversion of a string to number仅使用输入字符串的最左边的数字前缀。因此,20070106 14242520070106 160924在数字上下文中使用时都会转换为20070106

您的比较函数决定这两个字符串是相等的,因此它们可以按排序列表中的任何顺序出现。

有几种方法可以正确实现这种排序。

  1. 您可以将值作为日期的文本表示形式,并使用strcmp()在比较函数中进行比较。如果使用Y-m-d H:i:s format格式化日期,那么它们也可以按字符串排序。

      function cmp($a, $b) {
         return strcmp($a['date'], $b['date']);
      }
    
  2. 由于您已经拥有从日期的文本表示中删除':''-'的代码,因此请将其更改为删除' '(空格字符)。然后,生成的字符串会在被减去之前正确转换为数字,并且它们可以正确排序。

  3. 使用strtotime()功能(而不是删除字符)将日期转换为时间戳。它们是数字,它们排序正确,它们也是have a meaning

答案 1 :(得分:0)

比较您的日期,将其转换为时间戳。

function cmp($a, $b) {
    //['date'] should be PHP readable date format.
    return strtotime($b['date']) - strtotime($a['date']);
}

usort($grid,"cmp");

目前string - string会将您的ymd his转换为整数:

var_dump(
    '20100521 114000',
    (int) '20100521 114000',
    20100521114000,
    '20100521 114000' - '20100521 114005' // Diff is 5 seconds
);

string(15) "20100521 114000"
int(20100521)
int(20100521114000)
int(0)