当前位置: 首页> 最新文章列表> array_diff_assoc 函数实战教程:如何检测用户表单中修改过的字段?

array_diff_assoc 函数实战教程:如何检测用户表单中修改过的字段?

gitbox 2025-07-26

在 web 开发中,用户提交表单时,常常需要比对提交的数据与原始数据,特别是在修改用户信息的场景下。比如用户修改了个人资料,而我们希望检测哪些字段被修改过。PHP 提供的 array_diff_assoc() 函数可以帮助我们轻松完成这个任务。今天,我们将通过一个实际的案例,来学习如何利用这个函数检测表单中修改过的字段。

1. 什么是 array_diff_assoc() 函数?

array_diff_assoc() 函数用于计算两个数组的差异,基于键名和键值的对比。它返回一个包含在第一个数组中但不在第二个数组中的元素。需要注意的是,它不仅会对比数组的值,还会对比数组的键名,因此它比 array_diff() 更加严格。

函数原型:

<span><span><span class="hljs-title function_ invoke__">array_diff_assoc</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-variable">$array1</span></span><span>, </span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-variable">$array2</span></span><span>): </span><span><span class="hljs-keyword">array</span></span><span>
</span></span>
  • $array1:第一个数组。

  • $array2:第二个数组。

  • 返回值:一个包含 $array1 中所有与 $array2 不同的元素的数组。

2. 实际应用场景

假设我们有一个用户修改资料的表单,用户提交的信息包含名字、邮箱、电话等字段。我们希望通过原始的用户数据与提交的表单数据对比,检测出哪些字段已经被修改。

3. 示例代码

步骤一:定义原始数据和用户提交的数据

首先,定义一个包含用户原始数据的数组和一个包含用户提交数据的数组。

<span><span><span class="hljs-comment">// 假设这是数据库中存储的原始用户信息</span></span><span>
</span><span><span class="hljs-variable">$original_data</span></span><span> = [
    </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'John Doe'</span></span><span>,
    </span><span><span class="hljs-string">'email'</span></span><span> =&gt; </span><span><span class="hljs-string">'[email protected]'</span></span><span>,
    </span><span><span class="hljs-string">'phone'</span></span><span> =&gt; </span><span><span class="hljs-string">'123-456-7890'</span></span><span>
];

</span><span><span class="hljs-comment">// 假设这是用户提交的修改后的表单数据</span></span><span>
</span><span><span class="hljs-variable">$submitted_data</span></span><span> = [
    </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'John Doe'</span></span><span>,  </span><span><span class="hljs-comment">// 名字没有改</span></span><span>
    </span><span><span class="hljs-string">'email'</span></span><span> =&gt; </span><span><span class="hljs-string">'[email protected]'</span></span><span>,  </span><span><span class="hljs-comment">// 邮箱改了</span></span><span>
    </span><span><span class="hljs-string">'phone'</span></span><span> =&gt; </span><span><span class="hljs-string">'123-456-7890'</span></span><span>  </span><span><span class="hljs-comment">// 电话没改</span></span><span>
];
</span></span>

步骤二:使用 array_diff_assoc() 对比数据

接下来,使用 array_diff_assoc() 对比原始数据和提交的数据,找出哪些字段被修改了。

<span><span><span class="hljs-comment">// 使用 array_diff_assoc 来找出修改过的字段</span></span><span>
</span><span><span class="hljs-variable">$changed_fields</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_diff_assoc</span></span><span>(</span><span><span class="hljs-variable">$submitted_data</span></span><span>, </span><span><span class="hljs-variable">$original_data</span></span><span>);

</span><span><span class="hljs-comment">// 输出修改过的字段</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-keyword">empty</span></span><span>(</span><span><span class="hljs-variable">$changed_fields</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"修改过的字段有:\n"</span></span><span>;
    </span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$changed_fields</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span> =&gt; </span><span><span class="hljs-variable">$value</span></span><span>) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$key</span></span></span><span>: </span><span><span class="hljs-subst">$value</span></span><span>\n";
    }
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"没有修改任何字段。\n"</span></span><span>;
}
</span></span>

输出结果:

<span><span>修改过的字段有:
</span><span><span class="hljs-symbol">email</span></span><span><span class="hljs-punctuation">:</span></span><span> john.doe</span><span><span class="hljs-meta">@newdomain</span></span><span>.com
</span></span>

4. 解释

  • 在本例中,array_diff_assoc() 会比对 submitted_dataoriginal_data 两个数组的键和值。

  • 由于名字和电话没有改变,只有邮箱字段被认为是不同的,因此输出结果显示 email 字段已经被修改。

5. 优化:检测用户是否提交了修改

假设除了检测修改过的字段外,我们还想知道用户是否在表单中提交了修改。如果某些字段在原始数据中不存在,而在提交的数据中却有,那么可以通过 array_diff_assoc()array_diff_key() 的组合来判断。

<span><span><span class="hljs-comment">// 使用 array_diff_key 来检测用户是否提交了新的字段</span></span><span>
</span><span><span class="hljs-variable">$new_fields</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_diff_key</span></span><span>(</span><span><span class="hljs-variable">$submitted_data</span></span><span>, </span><span><span class="hljs-variable">$original_data</span></span><span>);

</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-keyword">empty</span></span><span>(</span><span><span class="hljs-variable">$new_fields</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"提交了新的字段:\n"</span></span><span>;
    </span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$new_fields</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span> =&gt; </span><span><span class="hljs-variable">$value</span></span><span>) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$key</span></span></span><span>: </span><span><span class="hljs-subst">$value</span></span><span>\n";
    }
}
</span></span>

6. 总结

array_diff_assoc() 是一个非常实用的函数,能够帮助我们轻松地检测哪些字段在用户提交的表单中发生了修改。在实际开发中,这个函数常常用于用户资料修改、订单修改等场景,确保我们能够准确地追踪到变化。

通过上述示例,你可以快速实现对比原始数据和用户提交数据的功能,帮助你更好地处理用户输入和表单验证。