如何比较2个阵列并根据差异执行多个操作?

时间:2016-06-21 20:03:58

标签: php arrays pdo

我有一个存储在数据库中的项目列表,我想提供编辑此列表的功能。我希望用户能够根据需要在此列表中添加和删除项目,然后在完成编辑时只点击一次“保存”按钮。然后,我需要使用这些更改来更新数据库中的列表。如何在不必从数据库中删除此列表并重新添加它的情况下执行此操作?

EX:
原始清单:项目a,项目b,项目c
新清单:项目a,项目c,项目d,项目e

我查看了array_diff()函数,但我不认为它会给我我需要的东西,因为我需要来自两个数组的信息。

2 个答案:

答案 0 :(得分:0)

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

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

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

Array Replace就像merge一样,除了编号索引。

还有递归合并和替换。

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

  $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' );

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

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

答案 1 :(得分:0)

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