【问题标题】:How to remove garbage data from array output如何从数组输出中删除垃圾数据
【发布时间】:2019-08-03 19:19:11
【问题描述】:

我在服务器上插入多个图像,并使用 (,) 将名称存储在 SQL 数据库中。

if($request->hasFile('images')){
     $images= [];
        foreach($images=$request->file('images') as $img) {
             $name=$img->getClientOriginalName();
             $img->move(public_path().'/dpic', $name);    

            $images[]=$name;
        }

    }
            $test =implode(", ", $images);   
            $product->images  =$test;

图像名称连同一些显示输出的数据一起插入到数据库中。

/tmp/php59iuBb, /tmp/phpdRewVH, PicturesI.jpg, Screenshot.png

我想从输出中删除这个/tmp/php59iuBb, /tmp/phpdRewVH 我该怎么做。

请指导我这样做。

【问题讨论】:

  • 这是个好问题。但是您不应该将客户端的原始文件名存储到数据库中。为什么?因为当您以原始名称将上传文件保存在磁盘上时,这是一个覆盖问题。万一,两个用户上传不同的文件和相同的文件名。现有文件将被替换。最好的方法是根据当前日期时间为图像创建一个新的文件名,确保在保存到磁盘和 sql 之前使用具有原始扩展名的唯一名称。

标签: php sql arrays laravel


【解决方案1】:

我会这样走,希望这对你有帮助。

$images= [];

if($request->hasFile('images')){

       foreach($request->file('images') as $img) {

       $name = "some_random_sting";

       $extension = $img->getClientOriginalExtension();

       $imgName = $name .'.'.$extension;

       $img->move(public_path().'/dpic', $imgName);    

       $images[] = $imgName;
   }

}

$test = implode(", ", $images);   
$product->images  = $test;

【讨论】:

    【解决方案2】:

    我会这样做

    $images =[
        '/tmp/php59iuBb', '/tmp/phpdRewVH', 'PicturesI.jpg', 'Screenshot.png'
    ];
    
    $images = preg_grep('~^(?!/tmp/)~', $images);
    
    print_r($images);
    

    输出

    Array
    (
        [2] => PicturesI.jpg
        [3] => Screenshot.png
    )
    

    Sandbox

    简单对了!

    Preg grep 对数组运行正则表达式并返回匹配项。

    在这种情况下

    • ~^(?!/tmp/)~ 否定后视 - 确保匹配不以 /tmp/ 开头

    这给我们留下了我们想要的东西。

    另一种选择是

     $images = array_filter($images,function($image){
                   return substr($image, 0, 5) != '/tmp/';
               });
    

    如果你没有感受到正则表达式的爱。

    Sandbox

    PS 我喜欢 preg_grep 它经常被忽略,因为它更容易理解但代码更冗长。 Preg Filter 是其中的另一个,您可以使用它来为整个数组添加前缀或后缀。例如,我用它来为文件名数组等添加路径。例如,这很简单:

    $images =[
        '/tmp/php59iuBb', '/tmp/phpdRewVH', 'PicturesI.jpg', 'Screenshot.png'
    ];
    
    print_r(preg_filter('~^(?!/tmp/)~', '/home/images/', $images));
    //or you can add a whole image tag, if you want, with a capture group (.+) and backrefrence \1
    print_r(preg_filter('~^(?!/tmp/)(.+)~', '<img src="/home/images/\1" />', $images));
    

    输出

    Array
    (
        [2] => /home/images/PicturesI.jpg
        [3] => /home/images/Screenshot.png
    )
    
    Array
    (
        [2] => <img src="/home/images/PicturesI.jpg" />
        [3] => <img src="/home/images/Screenshot.png" />
    )
    

    Sandbox

    我认为您可能会发现“技巧”很有用,因为您可以删除坏的并同时添加通往好的路径。它们值得一试。

    http://php.net/manual/en/function.preg-grep.php

    http://php.net/manual/en/function.preg-filter.php

    我觉得我应该提到匹配文件扩展名也是如此,这可能也很有用,但我将把它留到另一天。

    干杯!

    【讨论】:

    • 两件小事:1. 我会使用/^(?!\/tmp\/)/ 而不是/^(?!\/tmp).+/(不需要匹配字符串的其余部分,最好添加一个斜杠以完全匹配/tmp/ 而不是@ 987654336@ 和 2。我将在最后一个示例中使用相同的正则表达式来更好地展示 preg_filter,否则它的行为与 preg_replace 完全相同(因为它只匹配所有内容)并返回不需要的路径。
    • @Jeto - 这些都是很好的观点,已更新。这里已经很晚了,我很惊讶我错过了/tmperature/,我还为同样的问题修复了array_filter——我非常了解正则表达式,除了环顾四周。实际上,我一直在尝试练习它们。我只是假设我需要匹配字符串中的某些内容...感谢您指出这一点!出于明显的原因,我还更改了分隔符。我在晚年滑倒。
    【解决方案3】:

    foreach 循环语句还将图像的临时路径存储到$images

    在 foreach 中更改变量名

    $images=$request->file('images') tto $image=>$request->file('images')
    

    【讨论】:

      【解决方案4】:

      参加聚会有点晚了,但我个人更喜欢在这里使用pathinfo 而不是正则表达式,因为它专用于文件路径:

      $images = ['/tmp/php59iuBb', '/tmp/phpdRewVH', 'PicturesI.jpg', 'Screenshot.png'];
      
      $images = array_filter($images, function ($image) {
        return pathinfo($image, PATHINFO_DIRNAME) !== '/tmp';
      });
      
      print_r($images);
      

      演示:https://3v4l.org/6F6K8

      【讨论】:

        猜你喜欢
        • 2014-09-12
        • 2013-05-18
        • 2013-01-02
        • 2023-03-20
        • 2016-09-15
        • 2018-03-15
        • 1970-01-01
        • 2013-02-24
        • 1970-01-01
        相关资源
        最近更新 更多