微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法理解为什么我的嵌套 php foreach 循环没有按预期更新值

如何解决无法理解为什么我的嵌套 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 举报,一经查实,本站将立刻删除。