尊敬的StackOverflow用户。有问题。
Array 1:
array: 3 [▼
0 => "8"
1 => "13"
2 => "15"
]
Array 2:
array: 16 [▼
0 => 7
1 => 8
2 => 9
]
array_diff不起作用,因为第一个数字在第二个字符串中。
请提出解决问题的任何建议。我将对任何评论感到满意。非常感谢。
答案 0 :(得分:5)
您可以使用array_udiff
通过用户定义的回调比较数组,该回调在比较之前将值转换为ints:
$array1 = array('8', '13', '15');
$array2 = array(7, 8, 9);
$diffs = array_udiff($array1, $array2, function ($a, $b) { return (int)$a - (int)$b; });
print_r($diffs);
输出:
Array
(
[1] => 13
[2] => 15
)
更新
已经指出,未指定所需的输出,因此这是获取所有唯一值的方法:
$diffs1 = array_udiff($array1, $array2, function ($a, $b) { return (int)$a - (int)$b; });
$diffs2 = array_udiff($array2, $array1, function ($a, $b) { return (int)$a - (int)$b; });
$diffs = array_merge($diffs1, $diffs2);
print_r($diffs);
输出:
Array
(
[0] => 13
[1] => 15
[2] => 7
[3] => 9
)
以及使用array_uintersect
的所有匹配值:
$same = array_uintersect($array1, $array2, function ($a, $b) { return (int)$a - (int)$b; });
print_r($same);
输出:
Array
(
[0] => 8
)
注意
在PHP7中,现在有spaceship operator (<=>
),它也可以在比较功能中使用,例如
$diffs = array_udiff($array1, $array2, function ($a, $b) { return (int)$a <=> (int)$b; });
答案 1 :(得分:2)
您可以像这样使用数组映射来转换数组
$a1 = array_map('intval', $a1);
$a2 = array_map('intval', $a2);
然后进行数组比较,否则不做。
@Nick的解决方案更优雅。
因为,与实际需要相比,阵列走的次数不超过2倍。当然,如果您知道哪个是字符串,则可以将其转换为字符串,但我想我会发布另一种方式...
对于测试,您只需执行此操作
$a = [
"1",
"2" ,
"3"
];
var_dump($a);
var_dump(array_map('intval', $a));
输出
array(3) {
[0]=> string(1) "1"
[1]=> string(1) "2"
[2]=> string(1) "3"
}
array(3) {
[0]=> int(1)
[1]=> int(2)
[2]=> int(3)
}
这表明它确实将值转换为字符串,这很明显,但是我喜欢示例。所以你去了。
干杯!
更新
在执行了一些简单的基准测试之后,使用了100,000个字符串数字的数组,并从100次迭代中获取了平均时间,apx 0.0072 /秒将数组转换回ints:
//setup
$a = array_map('strval', range(0, 100000));
//get microtime as float after setup
$time = microtime(true);
//use the average of 100 conversion for consistency
$iterations = 100;
for($i=0;$i<$iterations; ++$i){
$b = array_map('intval', $a); //set to $b so we don't convert $a on our first iteration.
//check the first iteration, to make sure we have it setup correctly for our averaging
if($i==0)
echo number_format(
((microtime(true) - $time)),
4
)." \seconds\n\n";
}
echo number_format(
((microtime(true) - $time) / $itterations),
4
)." \seconds\n";
输出
0.0067 \seconds
//if these are close (which they are) we have everything setup right,
//it's better to take the average for speed testing.
//and I just wanted to double check that it was being done correctly
0.0072 \seconds
-请注意,沙盒只有134M的PHP Ram(我已经故意将其用完了内存来进行测试..大声笑)
<b>Fatal error</b>: Allowed memory size of 134217728 bytes exhausted
UPDATE1
已经指出,未指定所需的输出,因此这是获取所有唯一值的方法:
如果要从两个数组中获得唯一值,则可以
$unique = array_unique(array_replace($a1,$a2));
如果阵列是唯一的,则您可以执行array_replace
,因为您将合并2个唯一的阵列,以替换一个阵列中的任何一个,另一个阵列中重复的阵列。因此,如果可行,结果将是2个唯一数组的唯一组合。
答案 2 :(得分:0)
这不是问题。 PHP 不是 要求对字符串数和非字符串数进行解决。
当且仅当(string)$ elem1 ===(string)$ elem2,两个元素才被视为相等。换句话说:当字符串表示形式相同时。
来源:https://www.php.net/manual/en/function.array-diff.php
这是我在PHP 7.4.7中的输出。 (当我在PHP 5.6中运行它时,会发生相同的输出,这是我现在安装的最早的版本。)
php > var_dump(array_diff([1,2,3], ["2"]));
array(2) {
[0]=>
int(1)
[2]=>
int(3)
}