如何将字符串数组与数字数组进行比较?

时间:2018-09-02 00:08:44

标签: php laravel laravel-5

尊敬的StackOverflow用户。有问题。

Array 1:
array: 3 [▼
   0 => "8"
   1 => "13"
   2 => "15"
]

Array 2:
array: 16 [▼
   0 => 7
   1 => 8
   2 => 9
]

array_diff不起作用,因为第一个数字在第二个字符串中。

请提出解决问题的任何建议。我将对任何评论感到满意。非常感谢。

3 个答案:

答案 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)
}

Sandbox

这表明它确实将值转换为字符串,这很明显,但是我喜欢示例。所以你去了。

干杯!

更新

在执行了一些简单的基准测试之后,使用了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

Sandbox

-请注意,沙盒只有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)
}