You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:19:24