【问题标题】:How can I compare two arrays and list differences in PHP?如何比较两个数组并列出 PHP 中的差异?
【发布时间】:2009-02-02 19:50:20
【问题描述】:

我正在构建一个表单来执行以下操作:

  • 打印用户和权限表,从 MySQL 中提取。用户拥有的每个权限都是一个复选框,而他们缺少的每个权限都是一个未选中的复选框。
  • 允许管理员选中和取消选中复选框以授予或删除权限。
  • 提交表单后,仅显示将更改权限的用户的确认页面,突出显示具体更改。
  • 确认更改后,相应地修改数据库。

为此,我创建了两组用户权限:一组根据数据库显示的内容,另一组根据表单显示的内容。

如果用户在 MySQL 中缺少权限,它将显示为 0。如果他们在表单提交中缺少权限,则根本不存在。

这里有两个简单的数组示例:

数据库数组

[用户 1] => 数组([公共] => 1 [私人] => 1 [秘密] => 1 ) [用户2] => 数组([公共] => 1 [私人] => 0 [秘密] => 0 )

表单提交数组(撤销User1的“秘密”,交给User2)

[用户 1] => 数组([公共] => 1 [私人] => 1 ) [用户2] => 数组([公共] => 1 [秘密] => 1 )

问题

我怎样才能优雅地组合这两个数组来做一个“改变”数组,这样:

  • 忽略两者具有相同权限的用户
  • 其余用户拥有所有权限 - 公开、私有和秘密 - 设置为 0 或 1。
  • 如果表单提交数组中缺少每个权限,则为 0,如果在表单提交数组中,则为 1

例如,结合以上将得到:

[用户 1] => 数组([公共] => 1 [私人] => 1 [秘密] => 0 ) [用户2] => 数组([公共] => 1 [私人] => 0 [秘密] => 1 )

目前的尝试

  • 作为第一步,我尝试将 array_merge() 与第二个列出的表单数组一起使用,认为它会覆盖它们不同的数据库数组。相反,它删除了不同的元素。
  • 我曾尝试设置一个foreach() 语句来比较两个数组,但它变得复杂了,我认为必须有更简单的方法

更新

哇!一个新的答案把我的注意力拉回到这个老问题上。我得到了这个工作,但后来我放弃了这个疯狂的代码 - 它太复杂了,无法回去使用。相反,我编写了一个 PHP 后端脚本来一次更改一个权限,然后编写了一个 AJAX 前端来发送更改。更简单的代码,并且更改对用户来说是即时的。突出显示效果会在页面上提供有关更改内容的即时反馈。

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    这可能是您正在寻找的: array_diff()

    【讨论】:

      【解决方案2】:

      您可以通过参考PHP: Arrays manual 找到您需要的内容。您已经很好地记录了这个问题,但我仍然无法清楚地说明您需要什么。

      具体来说,您应该考虑使用 array_diff() 和 array_intersect() 来计算两个数组的差值或交集。

      【讨论】:

        【解决方案3】:

        帖子数据仅包含您应该授予的权限。因此,设置一个“基线”,将所有权限设置为 0。然后与提交合并。

        $empty_perms = array("public" => 0, "private" => 0, "secret" => 0);
        
        $new_user1_perms = array_merge($empty_perms, $_POST['User1']);
        $new_user2_perms = array_merge($empty_perms, $_POST['User2']);
        

        现在使用合并的数组更新数据库。这样,您将为所有元素设置正确的权限。

        【讨论】:

          【解决方案4】:

          让我们尝试将 gnud 的解决方案与按值比较结合起来。 我又添加了一个关键“成员”以显示零权限不变。

          // empty permissions
          $empty_perms = array("public" => 0, "private" => 0, "secret" => 0, "member" => 0);
          
          // original permissions (please note that it MUST contain ALL keys)
          $old_perms = array("public" => 1, "private" => 0, "secret" => 1, "member" => 0);
          
          // POST data container
          $post_data = array("public" => 1, "private" => 1);
          
          // apply new user permissions - put them into db
          $new_perms = array_merge($empty_perms, $post_data);
          
          // differences to show
          $diff_perms = array();
          
          // compare new and old permissions
          foreach($empty_perms as $k => $v) {
              $diff_perms[$k] = (int)($old_perms[$k] !== $new_perms[$k]);
          }
          

          这个例子应该给你以下结果(旧的、新的、变化的):

          Array
          (
              [public] => 1
              [private] => 0
              [secret] => 1
              [member] => 0
          )
          
          Array
          (
              [public] => 1
              [private] => 1
              [secret] => 0
              [member] => 0
          )
          
          Array
          (
              [public] => 0
              [private] => 1
              [secret] => 1
              [member] => 0
          )
          

          希望这会有所帮助。

          【讨论】:

            【解决方案5】:

            我想知道differential execution 的某种变化是否会有所帮助。

            【讨论】:

              【解决方案6】:

              要使用array_diff(),第一个参数必须是超集,或者两个数组中较大的一个。当您不确定哪个数组更大时使用array_diff()

                //start with the superset of for array_diff to return differences
                if(count($prev_wholesaler_assignments) > count($wholesalers)){
                    $perm_diff = array_diff($prev_wholesaler_assignments,$wholesalers);  
                } elseif (count($prev_wholesaler_assignments) < count($wholesalers)){
                    $perm_diff = array_diff($wholesalers,$prev_wholesaler_assignments);
                }
              

              无论哪个数组恰好更大,这都会返回析取。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2015-08-21
                • 1970-01-01
                • 2014-07-15
                • 2019-07-19
                • 1970-01-01
                相关资源
                最近更新 更多