2016-09-08 6 views
0

私はjson配列を持っています。私は3つの値を持っています。最初または2番目の値を削除すると、削除後の配列は1つの形式になります。しかし、最後の値を削除すると、結果の配列が常に変化します。私は文字列に変換することによって配列をエコーし​​ています。同じjson配列削除プロセスは、値の異なる位置に対して異なる結果配列を生成します。

iが最後のもの以外の任意の値を削除すると、それは、第1または第2または任意の他の値と同様

結果= {「1」である:{「名前」:「猫」}、「2」 :{ "名": "象"}}ここで

私は最初の値を削除 - 犬

$animals = '{ 
"0":{"name":"dog"}, 
"1":{"name":"cat"}, 
"2":{"name":"elephant"} 
}'; 
$animals = json_decode($animals, true); 
$del_value = "elephant"; 
$loginArray = array('name' => $del_value); 
if (in_array($loginArray, $animals)) { 
    foreach ($animals as $key => $value) { 
     if (in_array($del_value, $value)) { 
      unset($animals[$key]); 
     } 
    } 
} 
$animals_string = json_encode($animals); 
echo $animals_string; 

をしかし、私は最後の値を削除すると、それは別の書式を作成し

結果= [{ "名前": "犬"}、{ "名前": "猫"}]

ここでは、最後の値を削除 - 象

$animals = '{ 
"0":{"name":"dog"}, 
"1":{"name":"cat"}, 
"2":{"name":"elephant"} 
}'; 
$animals = json_decode($animals, true); 
$del_value = "elephant"; 
$loginArray = array('name' => $del_value); 
if (in_array($loginArray, $animals)) { 
    foreach ($animals as $key => $value) { 
     if (in_array($del_value, $value)) { 
      unset($animals[$key]); 
     } 
    } 
} 
$animals_string = json_encode($animals); 
echo $animals_string; 
+0

異なる形式を言うと、数値インデックスを持つオブジェクトではなく配列になるということですか?そうであれば、それは正常です。 – apokryfos

+0

ちょうど確認してください、その正常ではありません。私は最初の値または2番目の値を削除すると、1つの形式で配列を生成しますが、最後の値を削除する場合、配列の別の形式を生成します。 –

答えて

1

この現象はあります期待される。

  1. 連想:インデックスがただし0

から始まるシーケンシャル整数である:インデックスは文字列または非連続の整数数値添字

  • ことができる

    はPHPは、アレイの2種類をサポートしていJSONは2番目のタイプの配列しかサポートしていないため、結合配列をJSONに変換すると、代わりにオブジェクトが取得されます。 JSONオブジェクトに(任意の型の)

    フォースPHPアレイ:元のキーをドロップしてJSON配列に(任意の型の)

    print_r(json_encode([ 1,2,3,4 ])); //Prints [1,2,3,4] 
    print_r(json_encode([ 0=> 1, 1=>2, 2=>3, 3=>4 ])); //also prints [1,2,3,4] 
    print_r(json_encode([ "a" => 1, "b" => 2 ])); //Prints {"a":1,"b":2} 
    print_r(json_encode([ 1 => "a" , 2 => "b" ])); //Prints {"1":"a","2":"b"} 
    

    フォースPHP配列:

    $animals_string = json_encode((object)$animals); //Will always have form : {"i1":{"name":"X"},"i2":{"name":"Y"}} 
    

    あなたの特定のケースの問題は、JSONオブジェクトがPHPの数値インデックス配列wバック符号化されたときHICHはJSON配列となる:

    $animals = '{ 
        "0":{"name":"dog"}, 
        "1":{"name":"cat"}, 
        "2":{"name":"elephant"} 
    }'; 
    $animals = json_decode($animals, true); 
    
    echo json_encode($animals); 
    

    エコー

    [{ "名前": "犬"}、{ "名前": "猫"}、{ "名前": "elephant"}]

    最後の索引以外の索引を削除すると、PHP配列結合がJSONオブジェクトに変換されます。

    $animals = '{ 
    "0":{"name":"dog"}, 
    "1":{"name":"cat"}, 
    "2":{"name":"elephant"} 
    }'; 
    $animals = json_decode($animals, true); 
    $del_value = "elephant"; 
    $loginArray = array('name' => $del_value); 
    if (in_array($loginArray, $animals)) { 
        foreach ($animals as $key => $value) { 
         if (in_array($del_value, $value)) { 
          unset($animals[$key]); 
         } 
        } 
    } 
    $animals_string = json_encode((object)$animals); 
    echo $animals_string; //Always the same format 
    

    私はこのことができます願っています:あなたはあなたが必要とする別の出力は以下のようにそれについて明示的になりたい場合はPHPがをどのように動作するかこれは

    です。

  • +0

    あなたは理解できませんでした。あなたが言ったことに何の問題もありません。私はあなたの助けを請う。ありがとうございました。しかし、私の問題は、最後の値を削除する対第一/第二の値を削除する問題は何ですか、私は結果の配列を持っている後、私は最初の値を削除する3つの値があると仮定します。いいよ。私はそれらの3つの値から2番目の値を削除する場合。私は結果配列を得た。どちらの場合も結果配列は同じ形式です。最後の値を削除すると結果配列は別の形式になります。それは私が第1、第2、第3の値をそれぞれ削除しているようではありません。すべて異なるケースです。 –

    +0

    "(ケース1)1番目または2番目または3番目またはn番目の値を削除する"と "(ケース2)最後の値を削除する"という違いがあると言います。 –

    +1

    @SurajRoyさらに情報を追加しました。ポイントは、JSONオブジェクトをPHPの数値インデックス配列に変換する 'json_decode($ animals、true)'を実行するときです。配列の先頭または途中で何かを設定解除すると配列が連想され、最後に何かを設定解除すると数値的に索引付けされます。 – apokryfos

    関連する問題