PHP 2D数组_diff/array_intersect用于插入/更新/删除

PHP 2D数组_diff/array_intersect用于插入/更新/删除,php,arrays,2d,Php,Arrays,2d,我有一对2D数组,对应于数据库中的一组记录 一个数组包含当前记录,另一个数组包含新记录 我想要一个优雅的通用解决方案来对这些数组进行排序,以便我知道要插入或更新哪些新记录,以及要删除哪些当前记录。我确信这一定是常见的行为,但我想不出一个不需要大量嵌套数组循环的答案 我认为理想情况下,2D数组交叉点可以得到更新记录,而2D数组可以得到插入/删除记录。如果我说得对,我建议如下: $old_ids = array(); foreach ($old as $row) { $old_ids[$ro

我有一对2D数组,对应于数据库中的一组记录

一个数组包含当前记录,另一个数组包含新记录

我想要一个优雅的通用解决方案来对这些数组进行排序,以便我知道要插入或更新哪些新记录,以及要删除哪些当前记录。我确信这一定是常见的行为,但我想不出一个不需要大量嵌套数组循环的答案


我认为理想情况下,2D数组交叉点可以得到更新记录,而2D数组可以得到插入/删除记录。

如果我说得对,我建议如下:

$old_ids = array();
foreach ($old as $row) {
    $old_ids[$row['id']] = $row;
}
$new_ids = array();
foreach ($new as $row) {
    $new_ids[$row['id']] = $row;
}

$insert = array_diff_key($new_ids, $old_ids);
    //^^^Returns all records of $new_ids that aren't present in $old_ids
$update = array_intersect_key($new_ids, $old_ids);
    //^^^Returns all records of $new_ids that were present in $old_ids
$delete = array_diff_key($old_ids, $new_keys);
    //^^^Returns all records of $old_ids that aren't present in $new_ids
您现在有3个包含所有数据的数组,我认为名称清楚地告诉您如何处理它们。请记住,这些函数返回其第一个参数的数据,因此

array\u intersect\u key($new\u id,$old\u id)!=数组相交键($old\u id,$new\u id)


由于
array\u intersect\u key($new\u id,$old\u id)
将返回new数据,
array\u intersect\u key($old\u id,$new\u id)
将返回old数据,您必须再次查找新值。不要弄乱论点的顺序。

如果我没弄错的话,我建议如下:

$old_ids = array();
foreach ($old as $row) {
    $old_ids[$row['id']] = $row;
}
$new_ids = array();
foreach ($new as $row) {
    $new_ids[$row['id']] = $row;
}

$insert = array_diff_key($new_ids, $old_ids);
    //^^^Returns all records of $new_ids that aren't present in $old_ids
$update = array_intersect_key($new_ids, $old_ids);
    //^^^Returns all records of $new_ids that were present in $old_ids
$delete = array_diff_key($old_ids, $new_keys);
    //^^^Returns all records of $old_ids that aren't present in $new_ids
您现在有3个包含所有数据的数组,我认为名称清楚地告诉您如何处理它们。请记住,这些函数返回其第一个参数的数据,因此

array\u intersect\u key($new\u id,$old\u id)!=数组相交键($old\u id,$new\u id)


由于
array\u intersect\u key($new\u id,$old\u id)
将返回new数据,
array\u intersect\u key($old\u id,$new\u id)
将返回old数据,您必须再次查找新值。不要弄乱参数顺序。

请分享一些代码。“一段代码胜过千言万语”请分享一些代码。“一段代码胜过千言万语”谢谢-是的,这就是我所做的。我想我星期五想得太多了!唯一的补充是将intersect数组与旧数组进行比较,以检查是否需要更新。谢谢-是的,这就是我所做的。我想我星期五想得太多了!唯一的其他补充是将intersect数组与旧数组进行比较,以检查是否需要更新。