2017-08-31 35 views
-1
<!-- language: php -->  
<?php 
// test variables 
    $l1 = "http://youtube.com/channel/"; 
    $l2 = "http://youtube.com/channel/"; 
    $l3 = "http://youtube.com/channel/"; 
    $l4 = "http://youtube.com/channel/"; 
    $fl = "http://youtube.com/channel/"; 

    //set error false as default 
    $error = "false"; 

    //check if variables are ready for use, if they are, add them to `$l` array 
    //I do each check as a seperate line, as it looks cleaner than 1 long if statement. 
$l = []; 
if(!empty($l1)) $l[] = $l1; 
if(!empty($l2)) $l[] = $l2; 
if(!empty($l3)) $l[] = $l3; 
if(!empty($l4)) $l[] = $l4; 
if(!empty($fl)) $l[] = $fl; 

foreach($l as $key => $value) { 

    //1 line ternary is cleaner than if/else statetmnt 
    $errorKey = $key < 9? "0{$key}" : $key; 

    //each row by default has no error 
    $hasError = 0; 

    //check if this a valid url 
    if(!preg_match('|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|i', $value)) { 
     $error = "true"; 
     $hasError = 1; 
    } 

    if($hasError) { 
     //store error in array, to loop through later 
     $errors[] = $errorKey; 
    } 
} 
$search = '?sub_confirmation=1'; 
$searchUrl = "youtube.com/channel"; 

if (strpos($l, $searchUrl) !== false && strpos($l, $search) === false) { 
    $l = $value."".$search; 
} 

if($error == "false") { 
    echo $l1; 
    echo $l2; 
    echo $l3; 
    echo $l4; 
    echo $fl; 
} 

// deliver the error message 
//Check if $error has been set to true at any point 
if($error == "true") { 
    //loop through error array, echo error message if $errorNumber matches. 
    //at this point we KNOW there was an error at some point, no need to use a switch really 
    foreach($errors as $errorNumber) { 
     echo "Something went wrong here $errorNumber :o"; 
    } 
} 
?> 

こんにちは、私の問題は、strpos関数があるコードの最後です。基本的には、すべてのURLをチェックしたい、一度URLがあるとそうであれば最後に何かを加えてください。しかし、私はif文を4回($ fl変数はチェックする必要はありません)繰り返すことを望まないので、誰かが助けてくれることを願っています。より良い方法があります。私がforeach abothに入れた場合、それは特定の変数には適用されず、値変数にのみ適用されます。すべてのあなたが$valueにも対応する値に行われます行う変更これを行うことにより異なる変数に同じアクションを繰り返す方法

foreach($l as $key => &$value) { 

+1

コードの 'strpos'一部が同様にforeachループに入る必要があります。もう少し説明してもらえますか?なぜそれがうまくいかないと思うのですか? –

+0

私はそれがチェックされ、各URLのために編集する必要がある場合、私は値を使用して、単一の$ l1、$ l2変数ではなく、これらすべての後に再びこれらの変数で動作するでしょう –

答えて

0

あなたはこのforeachのヘッダ($valueの前で&に気づく)を使用して参照することにより$valueを割り当てることができます配列$lにあります。

は、その後、あなたがこのコードを入れて、foreachループの終わりに:

if (strpos($value, $searchUrl) !== false && strpos($value, $search) === false) { 
    $value .= $search; 
} 

だからあなたの最終foreachループは次のようになります。

foreach($l as $key => &$value) { 

    //1 line ternary is cleaner than if/else statetmnt 
    $errorKey = $key < 9? "0{$key}" : $key; 

    //each row by default has no error 
    $hasError = 0; 

    //check if this a valid url 
    if(!preg_match('|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|i', $value)) { 
     $error = "true"; 
     $hasError = 1; 
    } 

    if($hasError) { 
     //store error in array, to loop through later 
     $errors[] = $errorKey; 
    } 

    $search = '?sub_confirmation=1'; 
    $searchUrl = "youtube.com/channel"; 
    if (strpos($value, $searchUrl) !== false && strpos($value, $search) === false) { 
     $value .= $search; 
    } 
} 

をあなたはforeachの中で参照を使用する方法の詳細を読むことができますここでループ:PHP: foreach

編集: をするだけではなく、変更を適用するには$l配列の要素だけでなく、元の変数$l1$l2などに、あなたも参照としてあなたの配列に要素を割り当てる必要があります。

$l = []; 
if(!empty($l1)) $l[] = &$l1; 
if(!empty($l2)) $l[] = &$l2; 
if(!empty($l3)) $l[] = &$l3; 
if(!empty($l4)) $l[] = &$l4; 
if(!empty($fl)) $l[] = &$fl; 
+0

$ l1、$ l2、$ l3、$ l4、$ flのような単一の変数を変更しません。 –

+0

私の答えの編集を確認してください。変数を配列にも参照で代入するとうまくいくはずです。 –

0

を個人的に、私はこれが移動するための良い候補だと思いますclassに正直言って、私はあなたが何をしているのか100%は確信していませんが、あなたのコードをクラスに変換しようとします。

class L { 
    public $raw = null; 
    public $modified = null; 
    public $error = false; 
    // create the class 
    public function __construct($data=null) { 
     $this->raw = $data; 
     // Check the raw passed in data 
     if ($data) { 
      $this->isUrl(); 
     } 
     // If there was no error, check the data 
     if (! $this->error) { 
      $this->search(); 
     } 
    } 
    // Do something ? 
    public function debug() { 
     echo '<pre>'; 
     var_dump($this); 
     echo '</pre>'; 
    } 
    public function getData() { 
     return ($this->modified) ? : $this->raw; 
    } 
    private function isUrl() { 
     $this->error = (! preg_match('|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|i', $this->raw)); 
    } 
    // Should a failed search also be an error? 
    private function search() { 
     if ($this->raw) { 
      if ((strpos($this->raw, "youtube.com/channel") !== false) && 
       (strpos($this->raw, "?sub_confirmation=1") === false)) { 
       $this->modified = $this->raw ."?sub_confirmation=1"; 
      } 
     } 
    } 
} 

// Test data 
$testList[] = "test fail"; 
$testList[] = "https://youtube.com/searchFail"; 
$testList[] = "https://youtube.com/channel/success"; 
$testList[] = "https://youtube.com/channel/confirmed?sub_confirmation=1"; 

// Testing code 
foreach($testList as $key=>$val) { 
    $l[] = new L($val); 
} 

foreach($l as $key=>$val) { 
    // Check for an error 
    if ($val->error) { 
     $val->debug(); 
    } else { 
     echo '<pre>'.$val->getData().'</pre>'; 
    } 
} 

、出力は次のようになります。

object(L)#1 (3) { 
    ["raw"]=> 
    string(9) "test fail" 
    ["modified"]=> 
    NULL 
    ["error"]=> 
    bool(true) 
} 

https://youtube.com/searchFail 
https://youtube.com/channel/success?sub_confirmation=1 
https://youtube.com/channel/confirmed?sub_confirmation=1 
+0

これは私のために少し複雑ですが、私は理解し、私にとって重要なことを理解しようとします、まだあなたに感謝:D –

関連する問題