0

$arr次のような配列があります。

array(3) {
  [0]=>
  array(2) {
    ["food"]=>
    string(5) "Toast"
    ["age"]=>
    string(2) "28"
  }
  [1]=>
  array(2) {
    ["food"]=>
    string(5) "Pizza"
    ["age"]=>
    string(2) "45"
  }
  [2]=>
  array(2) {
    ["food"]=>
    string(5) "Steak"
    ["age"]=>
    string(2) "33"
  }
}

変数もあります$curr_age = 45;

$arr[$i]["age"] = $curr_age今、見つけて停止するまで配列を検索する方法を探しています。
また、次と前の配列 (この例ではトーストとステーキ) から食べ物を取得するにはどうすればよいですか?

配列を検索するために、次のコードがあります。

$i = 0;

foreach( $arr as $array ){ 

    if( $curr_age == $arr[$i]["age"] ) {

        $next = $arr[$i++]["food"];
        $prev = $arr[$i--]["food"];

    }

    $i++;

 }

ご想像のとおり、これは期待どおりに機能しておらず、その理由はわかりません。ただし、foreachループは実際にはインクリメントにのみ使用され、使用される$iこと$arrayはありませんが、これを修正する方法や上記のタスクを一般的に実行する方法がわかりません。

PHPにはこれを行うための「組み込み」の方法がないことをすでに知っていると思います。追加の関数が必要ですが、繰り返しになりますが、その関数が何をする必要があるのか​​ わかりません。この声明が真実であるかどうかさえ確信が持てません。

私はすでに試しarray_searchてから、キーを1ずつ増減させましたが、2つの理由でうまくいきませんでした。まず、array_searchそのタイプの配列を処理できないようです。次に、キーが連続していない可能性があるため、実行する$x++か、$x--正しくないようです。

4

3 に答える 3

2

配列インデックスはすでに数値であるため、増分インデックスを維持する必要は実際にはありません.foreachループでキー割り当てを使用し、アクセスする前に前と次のキーが実際に存在することを確認してください.

foreach ($arr as $k => $v) {
    if ($v['age'] == $curr_age) {
        if (isset($arr[$k-1])) {
            $prev = $arr[$k-1];
        }
        if (isset($arr[$k+1])) {
            $next = $arr[$k+1];
        }
        break;
    }
}
于 2013-01-09T10:16:09.983 に答える
1
$length = count($array);
for ($i = 0; $i < $length; $i++) {
  if( $curr_age == $array[$i]["age"] ) {
    if (i<$length){
        $next = $array[$i+1]["food"];
    }
    if (i>0){
        $prev = $array[$i-1]["food"];
    }
  }
}

配列をループするための答え+あなたのコード=解決済み。Mark Ba​​kerが指摘したように、割り当て前にチェックされていない場合、配列は間違った値を取得する可能性があります。

于 2013-01-09T09:22:25.880 に答える
1

$arr[$i]["age"] の代わりに、特定の位置 (ここでは $array) で foreach によって割り当てられた要素を比較して、これを試してください。

$i=0;

foreach($arr as $array)
{
    if($array['age'] == $curr_age)
    {
        $Previous = $arr[$i-1]['food'];
        $Next = $arr[$i+1]['food'];
        break;
    }

    $i++;
}
于 2013-01-09T09:36:06.397 に答える