1

多次元配列をループして、新しいサブ配列を追加しようとしています。私のコードはエラーを返しませんが、新しいアイテムも追加しません。

次のコードがあります。

foreach ($data['switches'] as $switch) {
    foreach ($switch['atags'] as $attributelist)  {
        $nohardwareAttribFound = false;

        foreach ($attributelist as $attribute) {
            $pos =  strpos(trim($attribute),'$attr_2_');

            if ($pos !==false)   {      

                //echo 'in the loop';
                //found it.  extract and exit loop
                $modelnumber = substr(trim($attribute),8);
                $hardwaremodel = array();
                $hardwaremodel['tag'] = 'hardware_model:'.$modelnumber;
                array_push($switch['atags'],$hardwaremodel);
                print_r($switch);
                //echo '<br>=====<br>';
                $nohardwareAttribFound = true;
            }   

        }//end foreach ($attributelist
    }// end foreach ($switch['atags']

    if ($nohardwareAttribFound==false) {
        $hardwaremodel['tag'] = 'Unknown';
        array_push($switch['atags'],$hardwaremodel);
    }//end if


}// end foreach ($data['switches']

データを次のようにしたいと思います。

[atags] => Array ( 
  [0] => Array ( [tag] => $id_365 ) 
  [1] => Array ( [tag] => $typeid_8 ) 
  [2] => Array ( [tag] => $any_object ) 
  [3] => Array ( [tag] => $casd ) 
  [4] => Array ( [tag] => $unmounted ) 
  [5] => Array ( [tag] => $no_asset_tag ) 
  [6] => Array ( [tag] => $attr_2_1086 ) 
  [7] => Array ( [tag] => $untagged ) 
  [8] => Array ( [tag] => hardware_model:1086 ) ) ) 

最後の array - element[8]は、追加した新しいサブ配列を表します。ステートメントは正しいようにprint_r()見えますが、ビューに渡された結果をループすると、実際には新しいタグ配列が追加されていないことがわかります。

の代わりに何らかの置換が必要array_push()ですか?

ループ中に配列を変更するのが得策でない場合は、アイテムが存在するかどうかを確認するだけでよいでしょうか。各スイッチの ['atags'] 配列に "$attr_2_NNNN" のような値を持つ [tag] が含まれているかどうかを確認するにはどうすればよいですか (N は数値)。たとえば、上記のサンプル配列の要素 6 を確認してください。課題は、常に要素 6 であるとは限らず、タグが attr_2 値を持つことが常に保証されるとは限らないことです。関数があることは知っていin_array()ます...次のようなものを試します:

if (in_array(array('$attr_2_'), $switches['atags']))

$nohardwareAttribFound 変数に関するロジックにバグがあり、これを修正します。
ありがとう

4

3 に答える 3

1

まず第一に、反復処理中に配列またはコレクションを変更することはお勧めしません。

本当にこのようにしたい場合$switchは、値ではなく参照を使用する必要があります。それ以外の場合は、必要に応じて変更できますが、配列$switchには反映されません。$data['switches']

参照で取得$switchするには、次を追加し&ます。

foreach ($data['switches'] as &$switch) { 
}

foreachPHPマニュアルで確認してください。

編集コードを調べた後、これがあなたが探しているものだと思います:

foreach ($data['switches'] as &$switch) { 
    $hardwaremodel = array();
    $hardwaremodel['tag'] = NULL; // initialize to NULL so we can check at the end of the loop if we have found a hardwaremodel or not (so we don't need that bool)

    foreach ($switch['atags'] as $attributelist) { 
        foreach ($attributelist as $attribute) { 
            $pos = strpos(trim($attribute), '$attr_2_'); 
            if ($pos !== false) {
                $modelnumber = substr(trim($attribute), 8);
                $hardwaremodel['tag'] = 'hardware_model:' . $modelnumber;
                break;
            }
        }
        if ($hardwaremodel['tag'] !== NULL)
            break; // exit the loop because we already found a tag
    }

    if ($hardwaremodel['tag'] === NULL)
        $hardwaremodel['tag'] = 'hardware_model:unknown';

    // Note that this is a safe place to modify the $switch array
    // as we are not currently iterating it
    array_push($switch['atags'], $hardwaremodel); 
}
于 2012-08-17T17:44:51.420 に答える
0

ループに入るたびに、interation 変数 (つまり$switch) はコピーです。元の配列は変更されません$data。そのためには、次のようにフル パスを変更する必要があります。

array_push($data['switches']['atags'], $newVal)

または、ループに入ったときに次のように参照渡しすることもできます。

foreach ($data['switches'] as &$switch) 
{
   // ... 
}
于 2012-08-17T17:45:06.837 に答える
0

交換した方がいいと思います

foreach ($data['switches'] as $switch) 

foreach ($data['switches'] as &$switch) 

参照を使用する必要があります。

注:後で unset($switch) を使用して参照を破棄してください。

于 2012-08-17T17:45:32.240 に答える