【问题标题】:PHP - get single file based on userPHP - 根据用户获取单个文件
【发布时间】:2016-09-20 10:12:24
【问题描述】:

我无法让我的代码按我想要的方式工作。

我正在使用scandir 从目录中获取所有文件。这给了我一个包含链接到产品的 pdf 文件的列表,但是问题来自于 pdf 文件的多种语言的可能性。像这样:

  • 1096_EN.pdf
  • 867_PT.pdf
  • 914_EN.pdf
  • 914_NL.pdf

_ 之前是 ID,语言之后。我希望用户每个产品只能看到一个文件。

我的代码如下所示:

$files =  scandir($dir);

foreach ($files as $file) 
{
    $exp_file = explode("_", $file);

    // check file for given ID
    if($exp_file[0] == $_GET['iD']){

        // check file for userlanguage

        if($exp_file[1] == $lang){
            echo $file;
        }
        // check file in english
        elseif($exp_file[1] == "EN"){
            echo $file;
        }
        // return available file in other language
        else{
            echo $file;
        }
    }
}

对于 914 和 NL,代码返回两个文件。在 914 和 PT 的情况下,我只得到 1 个文件,914_EN.pdf,在 867 和 NL 的情况下,将有零个文件。

过滤我的文件并返回最匹配的文件的最佳方法是什么?我个人认为错误在for循环中,但我找不到合适的出路..

谢谢

【问题讨论】:

  • 使用填充了for 扫描的临时数组,而不是直接回显。在for之后,打印第一个不为空的数组索引

标签: php arrays pdf for-loop output


【解决方案1】:

如果您只想拥有单个项目,则应保留已处理的积压工作,因为 foreach 循环将从例如 914_EN.pdf 转到 914_NL.pdf,而检查已经完成914_EN.pdf,所以当你到达 914_NL.pdf 时,它只是重新运行检查并认为没问题。

【讨论】:

    【解决方案2】:

    如果使用多个相同的值,您可以先清理数组以获得您想要的。你可以看看这个,如果这是你想要的。干杯!

    $files =  array("1096_EN.pdf", "867_PT.pdf", "914_EN.pdf", "914_NL.pdf");
        $new_exp_file = array();
            foreach ($files as $file) {
                $exp_file = explode("_", $file);
                $new_exp_file[] = $exp_file[0];
            }
    
            $new_exp_file_arr_ = array_values(array_unique($new_exp_file));
            for($i = 0, $file_ctr = count($new_exp_file_arr_); $i < $file_ctr; $i++) {
                if($new_exp_file_arr_[$i] == "914") {
                    echo $new_exp_file_arr_[$i] . "<br>";
                    echo "<ul>";
                        foreach ($files as $file) {
                            $exp_file = explode("_", $file);
                            if($new_exp_file_arr_[$i] == $exp_file[0]) {
                                echo "<li>" . $exp_file[1] . "</li>";
                            }
                        }
                    echo "</ul>";
                }
    
             }
    

    【讨论】:

      【解决方案3】:

      这似乎对我有用?不过,使用正则表达式可能不如上述方法有效。

      $_GET['iD'] = 1096;
      
      $ptn = "^((\d+)\_([a-zA-Z]+)\.([a-zA-Z]+))^";
      $aFiles = array('1096_EN.pdf','867_PT.pdf','914_EN.pdf','914_NL.pdf');
      $lang = "EN";
      
      foreach ($aFiles as $sFileName) 
      {
      
          preg_match($ptn, $sFileName, $aFileParts);
          var_dump($aFileParts);
      
      
          // check file for given ID
          if($aFileParts[2] == $_GET['iD']){
      
              // check file for userlanguage
              if(strtolower($aFileParts[3]) == strtolower($lang)){
                  echo $sFileName;
                  break;
              }
      
              // return available file in other language
              else{
                  echo $sFileName;
              }
          }
      
      }
      

      【讨论】:

        【解决方案4】:

        我通过以下方式解决了我的问题:

        if(glob($_GET['iD']."_".$_GET['t']."*.pdf"))
        {
            $file = glob($_GET['iD']."_".$_GET['t']."*.pdf");
            echo $file[0];
        }
        else 
        {
            if(glob($_GET['iD']."_EN*.pdf"))
            {
                $file = glob($_GET['iD']."_EN*.pdf");
                echo $file[0];
            }
            else
            {
                $file = glob($_GET['iD']."*.pdf");
                echo $file[0];
            }
        }
        

        不再循环,只需使用通配符检查不同的文件。奇迹般有效。我。更大的文件列表更干净..

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-01-08
          • 2012-04-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-12
          相关资源
          最近更新 更多