如何解决无法理解为什么我的嵌套 php foreach 循环没有按预期更新值
修改了我的原始代码。但是我仍然没有设法实际更新我的原始阵列。当我回显 echo '<pre>'.print_r( $form['fields'][8]['choices'][0]['text'] ).'</pre>';
时,我仍然得到我的原始数组值。没有多少程序员会在黑暗中辗转反侧。
$form_id = '6';
$form = GFAPI::get_form( $form_id );
foreach ( $form['fields'] as $key => &$field )
{
if (isset( $field['id']) && $field['id'] == 47 )
{
foreach ( $field['choices'] as $key => &$choice )
{
if (isset($choice['value']) && $choice['value'] == 1)
{
$choice['text'] = 'test';
$choice['price'] = '99';
echo '<pre>'.print_r( $choice['text']).'</pre>';
echo '<pre>'.print_r( $choice['price']).'</pre>';
}
}
}
}
echo '<pre>'.print_r( $form['fields'][8]['choices'][0]['text'] ).'</pre>';
$result = GFAPI::update_form( $form );
return $result;
解决方法
这一行:
foreach ($choices as $key => $choice)
创建存储在 $choices[$key]
中的数组的副本,$choice
指的是它,而不是原始 $choices
数组内部。
如果您将其更改为通过引用创建 $choice
,它应该可以工作:
foreach ($choices as $key => &$choice)
但我不建议这样做,因为在某些情况下可能会产生难以发现的微妙副作用。
更新:
我用这个代码测试过:
$form = [
"fields" => [
8 => [
"id" => 47,"choices" => [
0 => [
"value" => 1,"text" => "original text","price" => "original price",],];
foreach ( $form['fields'] as $key => &$field )
{
if (isset( $field['id']) && $field['id'] == 47 )
{
foreach ( $field['choices'] as $key => &$choice )
{
if (isset($choice['value']) && $choice['value'] == 1)
{
$choice['text'] = 'test';
$choice['price'] = '99';
echo "<pre>in-loop text: {$choice["text"]}</pre>";
echo "<pre>in-loop price: {$choice["price"]}</pre>";
}
}
}
}
echo "<pre>out-of-loop text: {$form['fields'][8]['choices'][0]['text']}</pre>";
我得到的输出似乎是我认为你所期望的:
in-loop text: test
in-loop price: 99
out-of-loop text: test
如果这不是你所期望的,那么我可能误解了这个问题......
,在这里您正在更新 $choices[$key]['text'] 值,以便您可以获得 $choices[$key]['text']。
您需要更新 $choice['text'] 的值。基本上你不需要 $key 在你的 foreach 循环中。如果您需要根据 $key == "some value" 等键过滤数据,则可以使用此 $key。
查看更新的代码
$fields = $form['fields'];
foreach ($fields as $key => $field)
{
if (isset($fields[$key]['id']) && $fields[$key]['id'] == 47)
{
$choices = $fields[$key]['choices'];
foreach ($choices as $key => $choice)
{
if (isset($choice['value']) && $choice['value'] == 1)
{
$choice['text'] = 'test';
$choice['price'] = '99';
echo '<pre>'.print_r( $choice['text']).'</pre>';
echo '<pre>'.print_r( $choice['price']).'</pre>';
}
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。