【问题标题】:How can I compare 2 arrays and perform multiple actions based on differences?如何比较 2 个数组并根据差异执行多个操作?
【发布时间】:2016-06-21 20:03:57
【问题描述】:

我有一个存储在数据库中的项目列表,我想提供编辑此列表的功能。我希望用户能够根据需要从该列表中添加和删除项目,然后在完成编辑后只点击某种“保存”按钮一次。然后我需要用这些更改更新数据库中的列表。我怎样才能做到这一点,而不必从数据库中删除此列表并重新添加它?

前:
原始清单:a 项、b 项、c 项
新列表:项目 a、项目 c、项目 d、项目 e

我查看了 array_diff() 函数,但我认为它不能满足我的需要,因为我需要来自两个数组的信息。

【问题讨论】:

  • array_diff、array_diff_key、array_intersect、array_intersect_key ......如果您更改顺序,所有这些输出内容都会有所不同,array_diff($arr1, $arr2) 和 array_diff($arr2, $arr1) 除非它们是同一个数组。 array_merge 和 array_replace 也很有用。
  • 你已经尝试了什么?也许可以使用所有可用的不同数组函数,看看是否适合你。

标签: php arrays pdo


【解决方案1】:

Array diff 将为您提供第一个数组和所有其他数组之间的差异。您可以更改第一个数组。不同之处在于其他数组中不存在的所有元素。如果要按键而不是值进行比较,请使用 array_diff_key。

Array Intersect 将给出相交或相同的项目,因此基本上数组 1 中出现在其他参数中的所有项目。同样,您可以更改第一个数组。

数组合并,将合并 2 个数组,如果它们有字符串键,则覆盖,原始数组将是 array1,然后按照它们从左到右出现的顺序覆盖。它们不会覆盖编号索引,而是添加元素。

数组替换就像合并,除了编号索引。

还有递归合并替换。

通过这些,您可以了解很多关于数组的信息。

  $arr1 = ['one'=>'foo','two'=>bar'];
  $arr2 = ['one' => 'foo', 'three' => 'blue'];

$a = array_diff_key( $arr1, $arr2 );
$b = array_diff_key( $arr2, $arr1 );

所以(没有实际测试这个)$a 应该是

 array('two'=>'bar');

因为第二个数组中不存在该元素

而$b 是

 array( 'three' => 'blue' );

因为(再次)第二个数组中不存在该元素

使用 intersect 我们可以看出one=> 出现在两个数组中。不确定这是否有帮助,但它们就是这样工作的,我一直在使用它们。

【讨论】:

    【解决方案2】:

    array_diff 应该可以工作,但您需要使用两次才能获得所需的信息,以避免删除和重新添加整个列表。在不编写所有查询之类的情况下,这是我将使用的一般方法:

    $db_list = $pdo->query('SELECT item FROM your_db.your_list')->fetchAll(PDO::FETCH_ASSOC);
    $user_list = $_POST['list_items_entered_by_user'];
    
    // Gets items in user list, but not in db
    $inserts = array_diff($user_list, $db_list);
    
    // Gets items in db, but not in user list
    $deletes = array_diff($db_list, $user_list);
    
    // start transaction
    // DELETE $deletes
    // INSERT $inserts
    // commit transaction
    

    【讨论】:

      猜你喜欢
      • 2015-08-21
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2020-02-15
      • 1970-01-01
      相关资源
      最近更新 更多