Magento2中PHP对比两数组差异:结果不符预期求助
解决Magento2中数组对比返回空数组的问题
咱们先搞清楚问题出在哪:你用array_diff和array_diff_key组合来对比数组,但这两个函数的逻辑根本不符合你的需求,才会导致明明有差异却返回空数组的情况。
问题根源
你的核心需求是:只对比$post中存在的键,检查这些键在$session中的值是否和$post一致;如果所有对应键值都相同返回空数组,否则返回差异的键值对。但:
array_diff()是按值对比,返回的是第一个数组中存在但第二个数组中没有的值,完全不考虑键的对应关系;array_diff_key()是按键对比,返回的是第一个数组中存在但第二个数组中没有的键值对,这也不是你要的——你不需要管$session里多出来的键(比如searchterm),只关心$post有的键对应的值是否不同。
拿你的示例来说,array_diff($session, $post)会找$session里有但$post里没有的值(比如x),但它只返回值而不是键值对;array_diff_key($session, $post)会返回$session多出来的searchterm键,这都不是你需要的差异内容,组合起来自然不符合预期。
正确的实现方法
我们只需要遍历$post的所有键,逐个和$session中对应键的值做严格对比,把值不同的键值对保留下来即可:
function formArray($session, $post) { $differences = []; // 只遍历$post中存在的键,符合你的需求范围 foreach ($post as $key => $postValue) { // 检查$session中是否有该键,并且值严格不相等(避免类型转换导致的误判) if (isset($session[$key]) && $session[$key] !== $postValue) { $differences[$key] = $postValue; // 如果需要同时展示session和post的差异,可以改成: // $differences[$key] = [ // 'session' => $session[$key], // 'post' => $postValue // ]; } } return $differences; }
测试你的示例
把你的数组代入函数测试:
$session = [ "domains" => 'x', "domain" => '', "searchfilter" => 'AD DOmain', "searchterm" => '' ]; $post = [ "domains" => 'xx', "domain" => 'AD DOmain', "searchfilter" => '' ]; var_dump(formArray($session, $post));
输出结果就是你预期的差异数组:
array(3) { ["domains"]=> string(2) "xx" ["domain"]=> string(8) "AD DOmain" ["searchfilter"]=> string(0) "" }
如果$post的所有键值和$session完全一致,函数会返回空数组,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Octopus
相关产品推荐
相关产品推荐

