基于重叠行过滤二维数组的行
在 PHP 中,array_diff_assoc() 函数通常用于确定之间的差异两个数组。但是,在涉及 2D 数组的某些场景中,用户在尝试过滤掉重叠行时可能会遇到意外结果。
用户报告使用 array_diff_assoc() 比较两个 2D 数组,但注意到结果包含两个数组的公共行数组而不仅仅是唯一的行。为了理解这个问题,让我们检查用户提供的示例数据:
$array1 = [ [12 => 'new q sets'], [11 => 'common set'] ]; $array2 => [ [11 => 'common set'] ];
调用 array_diff_assoc($array1, $array2) 后,用户期望收到仅包含 $array1 中唯一行的输出(即,'[12 => '新 q 组']')。然而,实际输出是:
[ [11 => 'common set'] ]
问题在于 PHP 比较 array_diff_assoc() 中的值的方式。仅当两个值作为字符串严格相等时才被视为相等。在提供的 2D 数组的情况下,两个数组中与键“11”关联的值是字符串“common set”。但键值对本身与数组并不相同。
因此,当 array_diff_assoc() 比较两个数组时,发现键值对 [11 =>; 'common set'] 对于两个数组来说是相同的,因此将其排除在差异之外。这种行为源于 PHP 中的所有数组在内部都表示为字符串“Array”这一事实。
要解决此问题,可以使用一种不同的方法来过滤掉 2D 数组之间的重叠行。一种常见的方法涉及为每一行创建唯一标识符,并使用该标识符作为关联数组的键。下面是一个示例:
$uniqueIdentifiers = []; $filteredRows = []; foreach ($array1 as $row) { $uniqueIdentifier = implode('|', array_values($row)); $uniqueIdentifiers[$uniqueIdentifier] = true; } foreach ($array2 as $row) { $uniqueIdentifier = implode('|', array_values($row)); if (isset($uniqueIdentifiers[$uniqueIdentifier])) { unset($uniqueIdentifiers[$uniqueIdentifier]); } } foreach ($uniqueIdentifiers as $uniqueIdentifier => $isPresent) { $filteredRows[] = array_values(array_flip(explode('|', $uniqueIdentifier))); }
此方法通过连接数组值并将其用作键来为每行创建一个唯一标识符。然后,它迭代第二个数组并从列表中取消设置任何匹配的唯一标识符。最后,它迭代剩余的唯一标识符,翻转键和值以重建行,并将它们添加到 $filteredRows 数组中。
通过利用此方法,您可以有效地过滤掉 2D 数组之间的重叠行同时确保唯一的行被正确识别并在结果中返回。
以上是如何使用 PHP 的 `array_diff_assoc()` 函数过滤二维数组中的重叠行?的详细内容。更多信息请关注PHP中文网其他相关文章!