【问题标题】:PHP glob range small issue why?PHP glob 范围小问题为什么?
【发布时间】:2015-11-10 10:57:44
【问题描述】:

我在按范围显示文件夹中的照片时遇到了一个小问题。

我当前的 PHP 代码:

$start = 0007;
$end = 0015;

$filenames = glob("$dirname/*{" . implode(",", range($start, $end)) . "}*", GLOB_BRACE);
            foreach ($filenames as $filename)
            {
                $tempo=explode('/',$filename);

                echo "<div class=\"col-lg-3 col-md4 col-xs-6 thumb\">";
                echo "<a class=\"thumbnail\" href=\"$softname?photo:$tour:$ordre:::$tempo[4]:$clients_id::::$argconcours\">";
                echo "<p align=\"center\">$tempo[3]/$tempo[4]</p>";
                echo "<img class=\"img-responsive\" src=\"$filename\" alt=\"$filename\">";
                echo "</a>";
                echo "</div>";
            }

显示照片 0008.jpg, 0018.jpg 0028.jpg ... 0080.jpg 0009.jpg, 0019.jpg ... 0089.jpg, 0011.jpg, 0012.jpg, 0013.jpg, 0014。 jpg, 0015.jpg,

看起来它会显示找到数字 8 或 9 的所有照片,然后执行 11、12、13、14、15。我看不出我做错了什么,因为它只显示从 0007 到 0015。
照片名称示例:W32_0008.JPG

【问题讨论】:

  • 看看你用“range”得到了什么,这是输出:/*{7,8,9,10,11,12,13}* ... 你是不同的方法解决问题。

标签: php


【解决方案1】:

0 开头的数字值(如00070015)被视为八进制数字。

0007(八进制7)将等同于十进制7

0015(八进制15)将等同于十进制13

如果您将这些定义为 string 值,我想您的问题不会成为问题:

$start = '0007';
$end = '0015';

编辑

我还怀疑您应该在 glob 表达式中使用 .. 范围运算符,而不是逗号分隔的数字列表(假设 PHP 的 glob 包装器支持 glob 的所有功能)

glob("$dirname/*{" . $start . '..' . $end . "}.jpg", GLOB_BRACE);

【讨论】:

  • 哦,八进制值很高兴知道它。我已经将 $start 和 $end 放入字符串中,就像您展示的那样,但结果是一样的。我也用双引号进行了测试,但遗憾的是没有变化。
  • 我用 .. 测试了我的初始 glob,而不是你的逗号,两者都没有返回照片。会不会是不支持的功能?带有单个逗号的 glob 仅返回 0007.jpg 和 0015.jpg
  • 我的 glob 没有任何逗号 (,) 它有两个点 (..) 这是 glob 范围运算符
  • 是的,我写了两个点,就像你在答案中写的那样,它没有返回任何照片。你认为它不会被支持吗?
【解决方案2】:

你应该在你的表达式中添加一个“结束”,这样你就可以实现“范围”功能:(仅搜索.jpg的示例)

glob("$dirname/*0{" . implode(",", range($start, $end)) . "}.jpg", GLOB_BRACE);

这只会在范围内有前导零时查找文件!

【讨论】:

  • 测试它,它只返回 0015.JPG,如果我用两个点替换双引号内的内爆旁边的逗号,就像 Mark Ba​​ker 建议的那样,它什么也不显示。
  • 进行了编辑,有错字。将 .jpg 文件放在刹车片外,这在我的机器上有效。
  • 我现在用你的编辑测试了它,它显示了很多照片 0007.JPG, 0017.JPG, 0027.JPG...
  • 问题:范围前面总是有0吗?
  • 是的,因为所有照片都有 4 位数字,例如 W20_1382.JPG 或 W21_0001.JPG。我已经发布了一个解决我的问题的答案,但它可能是脏代码
【解决方案3】:

我对 PHP 代码有了一个想法,它似乎解决了我的问题。我认为这可能是一个肮脏的代码。我愿意寻求建议或更好的方法。

while ($start <= $end) {
            $start = sprintf('%04d', $start);
            $end = sprintf('%04d', $end);

            $filenames = glob("$dirname/*" . $start . ".JPG", GLOB_NOSORT);
            foreach ($filenames as $filename)
            {
                $tempo=explode('/',$filename);

                echo "<div class=\"col-lg-3 col-md4 col-xs-6 thumb\">";
                echo "<a class=\"thumbnail\" href=\"$softname?photo:$tour:$ordre:::$tempo[4]:$clients_id::::$argconcours\">";
                echo "<p align=\"center\">$tempo[3]/$tempo[4]</p>";
                echo "<img class=\"img-responsive\" src=\"$filename\" alt=\"$filename\">";
                echo "</a>";
                echo "</div>";
            }
            $start++;   
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 2011-04-10
    • 2011-08-11
    • 2011-09-26
    • 1970-01-01
    相关资源
    最近更新 更多