通过各自的元素位置查找两个大小相等的平面数组之间的差异

问题描述 投票:0回答:4

我需要确定

$fields
数组中的元素在我的
$answer
数组的相同位置元素中没有相同的值。

$fields = array(
    '1x1' => 'k',  // first element
    '1x2' => 'B',  // second element
    '1x3' => 'c',  // third element
    '2x1' => 'd',  // fourth element
    '2x2' => 'x',  // fifth element
    '2x3' => 'Y',  // sixth element
    '3x1' => 'b',  // seventh element
    '3x2' => 'e',  // eighth element
    '3x3' => 'f'   // ninth element
);

$answer = array(
    'a',  // first element
    'b',  // second element
    'c',  // third element
    'd',  // fourth element
    'x',  // fifth element
    'y',  // sixth element
    'z',  // seventh element
    'e',  // eighth element
    'f'   // ninth element
);

print_r(array_diff($fields, $answer));

目前结果:

(
    [1x1] => k
    [1x2] => B
    [2x3] => Y
)

想要的结果:

(
    [1x1] => k    // first elements value differs
    [1x2] => B    // second element value differs
    [2x3] => Y    // sixth element value differs
    [3x1] => b    // seventh element value differs
)

在第七个元素中,

$answer
z
,但
$fields
b
。 如何将
'3x1' => 'b'
包含在结果中?

php arrays filter associative-array array-difference
4个回答
2
投票

这工作正常。根据

array_diff()
文档

数组 array_diff ( 数组 $array1 , 数组 $array2 [, 数组 $... ] )

将 array1 与一个或多个其他数组进行比较并返回 array1 中的值不存在于任何其他数组中。

文档中的另一个重要信息:

两个元素被认为相等当且仅当 (string) $elem1 === (字符串)$elem2。换句话说:当字符串表示相同时。

因此,在

$answers
数组中,
k, B, Y
数组中没有
$fields
元素。


2
投票

方法没有错,对比2个列表,都包含

b


0
投票

看到您将“b”放入 $answer 和 $fields 数组中。

这就是为什么它给你这样的输出。


0
投票

为了达到您想要的结果,您需要将关联键从第一个数组传输到第二个数组,然后调用

array_diff_assoc()
以便“每个元素位置”进行比较。 演示

var_export(
    array_diff_assoc(
        $fields,
        array_combine(array_keys($fields), $answer)
    )
);

输出:

  '1x1' => 'k',
  '1x2' => 'B',
  '2x3' => 'Y',
  '3x1' => 'b',
)

array_diff()
不适合此任务,因为
$answer[1] = 'b'
并且会从结果中删除
$fields['3x1'] = 'b'
,因为不考虑键,只比较值。

© www.soinside.com 2019 - 2024. All rights reserved.