2016-09-20 11 views
0

私のコードを自分の望むように動作させるのに問題があります。PHP - ユーザーに基づいて単一のファイルを取得する

私はscandirを使用してディレクトリからすべてのファイルを取得しています。これは、製品にリンクされたPDFファイルのリストを私に提供しますが、問題は複数の言語のpdfファイルのposibllityにあります。これと同じように:

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

IDと言語の後です。そして、私は、ユーザーが製品ごとに1つのファイルしか見ないようにしたい。コードは、2つのファイルを返す914の場合とNLは

$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とPTの場合は1ファイルしか取得できません。914_EN.pdf、867とNLの場合は0ファイルになります。

ファイルをフィルタリングして最も一致するファイルを返す最良の方法は何ですか?あなただけの単一のアイテムを持っているしたい場合は、あなたが既に持っているのバックログを維持する必要があり

おかげ

+0

一時的にエコーアウトする代わりに 'for'スキャンで埋め込まれた一時配列を使用してください。 'for'の後に空ではない最初の配列インデックスを出力します –

答えて

0

は、私は次のようで、私の問題を解決しました:

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]; 
    } 
} 

これ以上のループを、単にワイルドカードを持つ別のファイルをチェックします。魅力のように動作します。 I.m.o.

0

..私は個人的にエラーがforループしていると思うが、私は正しい道を見つけるカントforeachループは例えば914_EN.pdfから914_NL.pdfになりますが、914_EN.pdfのチェックはすでに完了していますので、914_NL.pdfに到達すると、チェックを再実行して大丈夫だと思います。

0

複数の同じ値を扱う場合は、最初に配列をクレンジングして、必要なものを得ることができます。あなたが望むなら、これを見てみることができます。乾杯!

$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>"; 
      } 

     } 
0

これは私にとってはうまくいくと思われますか?おそらく上記の方法ほど効率的ではない正規表現を使用します。

$_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; 
     } 
    } 

} 
関連する問題