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开始的。因此,我的回答是错误的和令人困惑的。对不起,我的坏…谢谢你,你是理智的;问题是数组中的相等对象是通过引用的;我的解决方案是克隆阵列中的所有对象,并用原始对象替换其对象,以获得不同的和个体的数字标记