Symfony php异常行为设置for循环中的属性

Symfony php异常行为设置for循环中的属性,symfony,for-loop,setter,Symfony,For Loop,Setter,我有一个如下生成的数组: array:7 [▼ 1 => array:5 [▼ 0 => array:2 [▼ 0 => Receta {#140 ▶} 1 => Receta {#71 ▶} ] 1 => array:2 [▶] 2 => array:4 [▶] 3 => array:2 [▶] 4 => array:4 [▶] ] 2 => array:5

我有一个如下生成的数组:

array:7 [▼
  1 => array:5 [▼
    0 => array:2 [▼
      0 => Receta {#140 ▶}
      1 => Receta {#71 ▶}
    ]
    1 => array:2 [▶]
    2 => array:4 [▶]
    3 => array:2 [▶]
    4 => array:4 [▶]
  ]
  2 => array:5 [▶]
  3 => array:5 [▶]
  4 => array:5 [▶]
  5 => array:5 [▶]
  6 => array:5 [▶]
  7 => array:5 [▶]
]
public function calculoPersonalizadoAction()
{
    $sesion = $this->get('session');
    $em = $this->getDoctrine()->getManager();


    /* GENERATE ARRAY */
    $estructura = new GeneradorDeEstructuraMenu($this->container, $sesion->get('valorId0'));
    $datosEstructurados = $estructura->ordenarEstructurasPorTipos();  

    $menuEstructurado = new EstructuradorDeMenus($sesion->get('recetas'), $datosEstructurados);   
    $recetasEstructuradas = $menuEstructurado->sustituirEnArrayEstructura(); // THIS IS THE ARRAY GENERATED WHAT I WANT TO TRAVERSE

    /* TRAVERSE ARRAY */
    for ($i=1; $i<=count($recetasEstructuradas); $i++){
        for ($n=0; $n<=count($recetasEstructuradas[$i])-1;$n++){
            for ($t=0; $t<=count($recetasEstructuradas[$i][$n])-1;$t++){

            $recetasEstructuradas[$i][$n][$t]->setMarca($i.$n.$t); 
            dump($recetasEstructuradas);
            }
        }
    }
    return $this->render('ComponentesBundle:GeneraMenu:calculoPersonalizado.html.twig', array(
        'recetasEstructuradas'=>$recetasEstructuradas,
    ));
}   
array:7 [▼
  1 => array:5 [▼
    0 => array:2 [▼
      0 => Receta {#140 ▼
        -...
        -marca: "100"
      }
      1 => Receta {#71 ▼
        -...
        -marca: "101"
      }
    ]
    1 => array:2 [▼
      0 => Receta {#42 ▼
        -...
        -marca: "110"
      }
      1 => Receta {#71 ▶}
    ]
    2 => array:4 [▶]
    3 => array:2 [▶]
    4 => array:4 [▶]
  ]
  2 => array:5 [▶]
  3 => array:5 [▶]
  4 => array:5 [▶]
  5 => array:5 [▶]
  6 => array:5 [▶]
  7 => array:5 [▶]
]   
最后,我们可以找到一个对象(Receta),其属性为“marca”;然后遍历数组并在控制器中设置属性,如下所示:

array:7 [▼
  1 => array:5 [▼
    0 => array:2 [▼
      0 => Receta {#140 ▶}
      1 => Receta {#71 ▶}
    ]
    1 => array:2 [▶]
    2 => array:4 [▶]
    3 => array:2 [▶]
    4 => array:4 [▶]
  ]
  2 => array:5 [▶]
  3 => array:5 [▶]
  4 => array:5 [▶]
  5 => array:5 [▶]
  6 => array:5 [▶]
  7 => array:5 [▶]
]
public function calculoPersonalizadoAction()
{
    $sesion = $this->get('session');
    $em = $this->getDoctrine()->getManager();


    /* GENERATE ARRAY */
    $estructura = new GeneradorDeEstructuraMenu($this->container, $sesion->get('valorId0'));
    $datosEstructurados = $estructura->ordenarEstructurasPorTipos();  

    $menuEstructurado = new EstructuradorDeMenus($sesion->get('recetas'), $datosEstructurados);   
    $recetasEstructuradas = $menuEstructurado->sustituirEnArrayEstructura(); // THIS IS THE ARRAY GENERATED WHAT I WANT TO TRAVERSE

    /* TRAVERSE ARRAY */
    for ($i=1; $i<=count($recetasEstructuradas); $i++){
        for ($n=0; $n<=count($recetasEstructuradas[$i])-1;$n++){
            for ($t=0; $t<=count($recetasEstructuradas[$i][$n])-1;$t++){

            $recetasEstructuradas[$i][$n][$t]->setMarca($i.$n.$t); 
            dump($recetasEstructuradas);
            }
        }
    }
    return $this->render('ComponentesBundle:GeneraMenu:calculoPersonalizado.html.twig', array(
        'recetasEstructuradas'=>$recetasEstructuradas,
    ));
}   
array:7 [▼
  1 => array:5 [▼
    0 => array:2 [▼
      0 => Receta {#140 ▼
        -...
        -marca: "100"
      }
      1 => Receta {#71 ▼
        -...
        -marca: "101"
      }
    ]
    1 => array:2 [▼
      0 => Receta {#42 ▼
        -...
        -marca: "110"
      }
      1 => Receta {#71 ▶}
    ]
    2 => array:4 [▶]
    3 => array:2 [▶]
    4 => array:4 [▶]
  ]
  2 => array:5 [▶]
  3 => array:5 [▶]
  4 => array:5 [▶]
  5 => array:5 [▶]
  6 => array:5 [▶]
  7 => array:5 [▶]
]   
但最后,我得到了一个类似于另一个的数组:

array:7 [▼
  1 => array:5 [▼
    0 => array:2 [▼
      0 => Receta {#140 ▼
        -...
        -marca: "730"
      }
      1 => Receta {#71 ▼
        -...
        -marca: "731"
      }
    ]
    1 => array:2 [▼
      0 => Receta {#42 ▼
        -...
        -marca: "710"
      }
      1 => Receta {#71 ▶}
    ]
    2 => array:4 [▶]
    3 => array:2 [▶]
    4 => array:4 [▶]
  ]
  2 => array:5 [▶]
  3 => array:5 [▶]
  4 => array:5 [▶]
  5 => array:5 [▶]
  6 => array:5 [▶]
  7 => array:5 [▶]
]
请注意,位置[7][3][0]中的对象与位置[1][0][1]中的对象相同,我假设当数组被遍历并到达[7][3][0]时,它会覆盖以前相同的对象。 我不知道为什么会在循环中发生这种情况,也不知道我在设置属性时做错了什么。
感谢您的回复。

重复的对象似乎是同一个对象(请查看哈希和数字标记,例如#71),因此它们通过引用传递:

 1 => Receta {#71 ▼
    -...
    -marca: "101"
  }
]
1 => array:2 [▼
  0 => Receta {#42 ▼
    -...
    -marca: "110"
  }
  1 => Receta {#71 ▶}
]

确保您在
EsstructureAdordemenus
类中使用
new Receta

我删除了我的答案,因为在仔细查看您的数组后,我意识到您是从索引1开始的,而不是从0开始的。因此,我的回答是错误的和令人困惑的。对不起,我的坏…谢谢你,你是理智的;问题是数组中的相等对象是通过引用的;我的解决方案是克隆阵列中的所有对象,并用原始对象替换其对象,以获得不同的和个体的数字标记