2017-08-30 15 views
1

$urlsDBはJSONを含む変数です。Foreach URL JSONデコード

print_r($urlsDB); 

出力:

[\"http:\\/\\/localhost\\/theme\\/wp-content\\/uploads\\/2017\\/08\\/LOGO-SEG-2.png\",\"http:\\/\\/localhost\\/theme\\/wp-content\\/uploads\\/2017\\/08\\/algoritims.jpg\"] 

にはどうすれば正しくjson_decodeを使用してforeach作成するのですか?

<?php 
    $urls = json_decode($urlsDB , true); 

    if ($urls != '') { 

      foreach ($urls as $url) { 
    ?> 
    <img src="<?php echo $url;?>" class="img-responsive img-thumbnail " /> 

    <?php 
    } 
    } 

    ?> 

Var_dump($urls);が空です。

答えて

0

var_dump($json)の出力は私に次のよう

array(2) { 
    [0]=> string(64) "http://localhost/theme/wp-content/uploads/2017/08/LOGO-SEG-2.png" 
    [1]=> string(64) "http://localhost/theme/wp-content/uploads/2017/08/algoritims.jpg" 
} 

を与えるjson_decode()

$input = '[\"http:\\/\\/localhost\\/theme\\/wp-content\\/uploads\\/2017\\/08\\/LOGO-SEG-2.png\",\"http:\\/\\/localhost\\/theme\\/wp-content\\/uploads\\/2017\\/08\\/algoritims.jpg\"]'; 

$json = json_decode(stripslashes($input),true); 

前にスラッシュをストリッピングしてみはhereそれを試してみてください!


編集に追加する:

に元の文字列を、それは何の鍵を持っていないので、実際にJSON配列ではなく、オブジェクトの文字列表現です。私は各要素のurlキーを持つオブジェクトで同じ修正を試みましたが、これが結果です。

$input = '[{\"url\" : \"http:\\/\\/localhost\\/theme\\/wp-content\\/uploads\\/2017\\/08\\/LOGO-SEG-2.png\"},{\"url\" : \"http:\\/\\/localhost\\/theme\\/wp-content\\/uploads\\/2017\\/08\\/algoritims.jpg\"}]'; 

$json = json_decode(stripslashes($input),true); 

出力:

array(2) { 
    [0]=> array(1) { 
     ["url"]=> string(64) "http://localhost/theme/wp-content/uploads/2017/08/LOGO-SEG-2.png" 
    } 
    [1]=> array(1) { 
     ["url"]=> string(64) "http://localhost/theme/wp-content/uploads/2017/08/algoritims.jpg" 
    } 
} 

さらに、\"ない文字列リテラルで有効なJSON文字です。変数が"(例:$encoded = "{\"some value\"}";)を使用して宣言されている場合にのみ有効です。

echo var_dump(json_decode('{\"myKey\": \"myValue\"}', true)); // output: NULL 

お試しくださいlive

+0

これは症状を治療するもので、症状は治療していません。原因。また、any要素に二重引用符が含まれていると、破損します。 – ishegg

+0

@ishegg私は同意しません。なぜなら、 'json_decode()'がバックスラッシュ(backslash)のために動作しない理由は(OP:バックスラッシュの存在が答えの文字列の唯一の違いです) OPはこのデータを取得していますが、われわれが知っているすべての理由で、入力値 –

+1

を制御できない可能性があります。これはバックスラッシュのためです。しかし、問題は '\"はJSONオブジェクト内の有効な文字列であるため、それらを取り除くと、将来は問題が発生します(URLにはテキスト記述があります。 JSONでエンコードされた文字列を 'stripslashes()'することでコードが破損します。 – ishegg

1

無効なJSONが表示されています。あなたは最初と最後に引用符をエスケープしました。これは有効です:

["http:\\/\\/localhost\\/theme\\/wp-content\\/uploads\\/2017\\/08\\/LOGO-SEG-2.png","http:\\/\\/localhost\\/theme\\/wp-content\\/uploads\\/2017\\/08\\/algoritims.jpg"] 

多分あなたはそれを処理する前にデータベースにいくつかのフィルタを適用していますか?

これは、作業する必要があります。

<?php 
$a = '["http:\\/\\/localhost\\/theme\\/wp-content\\/uploads\\/2017\\/08\\/LOGO-SEG-2.png","http:\\/\\/localhost\\/theme\\/wp-content\\/uploads\\/2017\\/08\\/algoritims.jpg"] 
'; 
$urls = json_decode($a, true); 
if (count($urls) > 0) { 
    foreach ($urls as $url) { 
    ?> 
     <img src="<?php echo $url;?>" class="img-responsive img-thumbnail " /> 
    <?php 
    } 
} 

あなたはJSONエンコードされた文字列htmlspecialchars()べきではありません。これは引用符をエスケープし、JSONオブジェクトを無効にします。あなたがすべきことは、アレイのすべての要素を個別に、好ましくは表示の瞬間に、htmlspecialchars()です。保存する瞬間ではありません(hereを読んでください)。

+0

私は 'htmlspecialchars'を使用しました。入力に配列を保存できなかったので、配列をJSONに変換しました – Gislef

+1

JSONに**エンコーディングした後、htmlspecialchars()**を使用しましたか?エンコードする前にやってからエンコードしてください。それでは問題はありません。または、各要素を印刷するときまで、デコードしない限り、まったくやってはいけません。 – ishegg

+1

さらに良い解決策は、htmlspecialcharsをまったく使用しないことです。あなたはそれを保存するのではなく、表示する*直前に行う –