我试图通过比较2个数组来生成数组:第一个数组有更多的元素,如:
array1: {
0 => "car1"
1 => "car2"
2 => "car3"
3 => "car4"
4 => "car5"
}
和第二个数组没有所有元素:
array2: {
0 => "car1"
1 => "car4"
2 => "car5"
}
因此,所有可能的类别(array1)和分配给post(array2)的类别(它是一个WordPress的东西)。
我试图比较那些数组(但不是array_diff()
函数,它给了我元素值而不是boolean)并得到结果为true / false。所以我想比较数组的每个值并生成数组映射或者使用array_combine()
函数来获取这样的数组:
result_array: {
"car1": true,
"car2": false,
"car3": false
}
等...
输出数组具有所有类别及其结果(true,false)非常重要
有没有简单的方法可以做到,或者可能是我可以使用的功能?
答案 0 :(得分:8)
阵列很有趣!
PHP具有TON的数组函数,因此有很多潜在的解决方案。
我提出这个作为个人挑战,不使用循环,过滤器或地图。
此解决方案使用array_intersect查找两个数组中存在的值,然后array_values以及array_fill_keys将它们转换为填充TRUE
或{{1}的关联数组}},最后array_merge将它们组合成一个数组:
FALSE
$array1 = array( 0 => "car1", 1 => "car2", 2 => "car3", 3 => "car4", 4 => "car5");
$array2 = array( 0 => "car1", 1 => "car4", 2 => "car5" );
// Find all values that exist in both arrays
$intersect = array_intersect( $array1, $array2 );
// Turn it into an associative array with TRUE values
$intersect = array_fill_keys( array_values($intersect), TRUE );
// Turn the original array into an associative array with FALSE values
$array1 = array_fill_keys( array_values( $array1 ), FALSE );
// Merge / combine the arrays - $intersect MUST be second so that TRUE values override FALSE values
$results = array_merge( $array1, $intersect );
导致:
var_dump( $results );
答案 1 :(得分:4)
array_map
或array_combine
实际上并未返回您想要的内容。如果您想在不编写foreach循环的情况下使用array_map
来获得所需的效果,下面会给出您想要的结果。请注意,您必须将array3
作为参考传递。
<?php
$array1 = array( 0 => "car1", 1 => "car2", 2 => "car3", 3 => "car4", 4 => "car5");
$array2 = array( 0 => "car1", 1 => "car4", 2 => "car5" );
$array3 = [];
array_map(function($a) use ($array2, &$array3) {
$array3[$a] = in_array($a, array_values($array2));
}, $array1);
var_dump($array3);
输出:
array(5) {
["car1"]=>
bool(true)
["car2"]=>
bool(false)
["car3"]=>
bool(false)
["car4"]=>
bool(true)
["car5"]=>
bool(true)
}
答案 2 :(得分:2)
这很慢,但它应该做你想要的,并且易于理解。
// Loop over the outer array which we're told has all the categories
$result = array();
foreach($array1 as $sCar1) {
$found = false;
// Loop over the categories of the post
foreach($array2 as $sCar2) {
// If the current post category matches
// the current category we're searching for
// note it and move on
if($sCar2 == $sCar1) {
$found = true;
break;
}
}
// Now indicate in the result if the post has the current category
$result[$sCar1] = $found;
}
答案 3 :(得分:2)
<?php
//EXAMPLE 1
$array1 = [0 => "car1", 1 => "car2", 2 => "car3", 3 => "car4", 4 => "car5"];
$array2 = [0 => "car1", 1 => "car4", 2 => "car5"];
$resultArray = [];
foreach ($array1 as $key => $val) {
$resultArray[$val] = in_array($val, $array2);
}
var_dump($resultArray);
?>
<?php
//EXAMPLE 2
$array1 = [0 => "car1", 1 => "car2", 2 => "car3", 3 => "car4", 4 => "car5"];
$array2 = [0 => "car1", 1 => "car4", 2 => "car5"];
$resultArray = [];
$flipped = array_flip($array2);
foreach ($array1 as $key => $val) {
$resultArray[$val] = isset($flipped[$val]);
}
var_dump($resultArray);
?>
结果:
array (size=5)
'car1' => boolean true
'car2' => boolean false
'car3' => boolean false
'car4' => boolean true
'car5' => boolean true
答案 4 :(得分:2)
使用array_count_values
就像这样简单:
$results = array_map(function ($count) {
return $count !== 1;
}, array_count_values(array_merge($array1, $array2)));
基本上,我们将两个数组合并在一起,然后计算值的出现次数。然后,如果计数不等于1,我们将值映射到true
,否则 - false
。有趣的是,无论哪个数组更短,这都会有效。
这是working demo。
请注意,array_count_values
函数会为每个非字符串或整数的元素抛出E_WARNING。所以这种方法只适用于字符串和整数数组。
此外,如果您的数组元素不是唯一的,这种方法可能会失败,因为这种情况您必须事先将array_unique
应用于每个数组。