0

foreach as list コマンドを使用して、各サブ配列を抽出しようとしています。

更新しました:

私は今これを試しています:

  foreach ($data as $element) {
  list($id,$ownerid,$owner,$coords,$name,$score,$citytype,$location) = $element;
  findcontinent($coords);
  echo $coords;
  echo '<br>';
  echo $cont;
  echo '<br>';}

私が呼び出している関数は次のとおりです。たとえば、配列 $data[0]['coords'] から特定の座標を静的に呼び出すと、この関数が機能することがわかります。

function findcontinent($coords){
            $tc2 = explode(":",$coords);
            $tcx = (int)(trim($tc2[0],"'\'"));
            $tcy = (int)(trim($tc2[1],"'"));
            $tcx2 = round((($tcx)*(600/383)),0);
            $tcy2 = round((($tcy)*(600/360)),0);

            if($tcx2 < 100) // checking for continents ending with 0
            {
            $tcx3 = '0';
            $xtrans = substr((string)$tcx3,0,1);
            }
            else
            {
            $xtrans = substr((string)$tcx2,0,1);
            }           

            if($tcy2 < 100) // checking for continents starting with 0
            {
            $tcy3 = '0';
            $ytrans = substr((string)$tcy3,0,1);
            }
            else
            {
            $ytrans = substr((string)$tcy2,0,1);
            }
    $cont = C.$ytrans.$xtrans;
    return($cont);

}

次に、一連の SQL コマンドを実行して DB を更新したいと考えています。私は正しい構文を持っていますか?

私の配列は次のとおりです-サンプル。実際のデータセットは動的で、多くの個々のサブ配列である可能性がありますか?

[data] => Array
    (
        [0] => Array
            (
                [id] => 16515340
                [owner_id] => 3475
                [owner] => Player1
                [coords] => '268:252
                [name] => AC2013
                [score] => 11863
                [city_type] => castle
                [location] => land
            )

        [1] => Array
            (
                [id] => 16515335
                [owner_id] => 3475
                [owner] => Player1
                [coords] => '263:252
                [name] => AC2013
                [score] => 7
                [city_type] => castle
                [location] => water
            )

        [2] => Array
            (
                [id] => 17891610
                [owner_id] => 3523
                [owner] => Player2
                [coords] => '282:273
                [name] => City of Repoman9900
                [score] => 1978
                [city_type] => castle
                [location] => water
            )

        [3] => Array
            (
                [id] => 10616856
                [owner_id] => 73
                [owner] => Player2
                [coords] => '024:162
                [name] => 1killer
                [score] => 1308
                [city_type] => castle
                [location] => water
            )

        [4] => Array
            (
                [id] => 10813465
                [owner_id] => 2862
                [owner] => Player3
                [coords] => '025:165
                [name] => City of vuvuzea991
                [score] => 1091
                [city_type] => castle
                [location] => land
            )

        [5] => Array
            (
                [id] => 17367317
                [owner_id] => 84
                [owner] => Player4
                [coords] => '277:265
                [name] => Dreadland
                [score] => 776
                [city_type] => castle
                [location] => water
            )

        [6] => Array
            (
                [id] => 2162850
                [owner_id] => 2989
                [owner] => Player5
                [coords] => '162:033
                [name] => City of Dinoeyez
                [score] => 157
                [city_type] => castle
                [location] => water
            )

        [7] => Array
            (
                [id] => 2818192
                [owner_id] => 556
                [owner] => Player6
                [coords] => '144:043
                [name] => City of wildfire123
                [score] => 7
                [city_type] => castle
                [location] => water
            )

    )

連想配列はリストに分解できないように見えるので、これは良かったのですが、このループを実行して 1 つのレコードでも抽出しようとすると失敗します

$カウント = 0; // 配列を循環するループ

foreach($data as $data=>$inner_array){
    $c2 = (string)$count;   
    $id = $data[$count]['id'];
    echo $id;
    echo '<br>';
    echo $count;
    echo '<br>';    
 //then increment counter and move to next
     $count = $count+1;
    }

カウンターは問題なく返されますが、サブ配列内の変数を解析できないようです。エコー出力は次のとおりです。

<br>0<br><br>1<br><br>2<br><br>3<br><br>4<br><br>5<br>

現在使用しているデータ セットは 6 つのサブ配列であるため、ループを正しく通過していることがわかります。

4

1 に答える 1

3
foreach ($data as list($id,$ownerid,$owner,$coords,$name,$score,$citytype,$location)) {
  // commands
}

この の使用はlistPHP のベータ版でのみ許可されているため、より移植性の高い構文には 2 つの手順が必要です。

foreach ($data as $element) {
  list($id,$ownerid,$owner,$coords,$name,$score,$citytype,$location) = $element;
  // commands
}

foreach ($data=>inner_array as xxx)有効じゃない。var=>var 構文はas、 の前ではなく、 の後にのみ有効です。for ループをネストした理由がわかりません。繰り返し処理する必要がある配列は 1 つだけです。

サブ配列が連想配列である場合、この構文の使用には非常に注意が必要です。リストの割り当ては、サブ配列内の要素の順序に基づいており、変数名とキーを一致させようとしません。したがって、owner_id要素が要素の前にあるサブ配列があるid場合、リストの割り当ては$id所有者 ID と ID に設定され$owner_idます。連想配列内の要素の順序は、それらが配列に追加された順序です (array_sort()またはなどの関数を使用してそれらを再配置しarray_splice()ない限り)、常に同じ順序でキーを追加することが確実でない限り、これは可能です。危険です。

アップデート:

このようなリストの割り当ては、連想配列では機能しません。PHPリストのドキュメントによると:

list()は数値配列でのみ機能し、数値インデックスが 0 から始まると想定します。

したがって、変数を個別に割り当てる必要があります。

foreach ($data as $element) {
  $id = $element['id'];
  $owner_id = $element['owner_id'];
  // and so on
}
于 2013-04-03T19:23:56.517 に答える