我有2个数组,一个来自输出源,另一个是我自己的输入,我正在使用7个元素中的5个比较值。 最终,我想创建一个搜索例程。
计划分部
// first array - only need elements 2 to 7
$array = array(1974, 13/12/2018, 1, 17, 22, 36, 39, 42);
// use elements 2 to 7 to create new array
$array = array_slice($array, 2, 7, true);
// second array - my input to check if same
$mydraws_array = array(1, 17, 22, 36, 39, 42);
// check if same elements
function same_keys ($a1, $a2) {
$same = false;
if (!array_diff_key($a1, $a2)) {
$same = true;
foreach ($a1 as $k => $v) {
if (is_array($v) && !same_keys($v, $a2[$k])) {
$same = false;
break;
}
}
}
return $same;
}
echo "var_dump same_keys"; var_dump(same_keys( $array, $mydraws_array ));
echo "joker draws"; echo"<br />";
echo "<pre>"; print_r($array); echo "</pre>"; echo"<br />";
echo "mydraws elements"; echo"<br />";
echo "<pre>"; print_r($mydraws_array); echo "</pre>"; echo"<br />";
echo "var_dump array_intersect_key"; var_dump(array_intersect_key( $array, $mydraws_array ));
echo "var_dump array_diff_key"; var_dump(array_diff_key( $array, $mydraws_array ));
输出
var_dump same_keys
boolean false
joker draws
Array
(
[2] => 1
[3] => 17
[4] => 22
[5] => 36
[6] => 39
[7] => 42
)
mydraws elements
Array
(
[0] => 1
[1] => 17
[2] => 22
[3] => 36
[4] => 39
[5] => 42
)
var_dump array_intersect_key
array (size=4)
2 => string '1' (length=1)
3 => string '17' (length=2)
4 => string '22' (length=2)
5 => string '36' (length=2)
var_dump array_diff_key
array (size=2)
6 => string '39' (length=2)
7 => string '42' (length=2)
输入文件以utf-8编码。 为什么它们不相等,为什么使用array_diff_key显示键6和7?
答案 0 :(得分:1)
问题是array_slice()
会将键保留在初始数组中,因此您可以看到它的键从2开始,而$mydraws_array
是从新创建的,因此将使用键创建0。
如果在切片数组上使用array_values()
,这将重置密钥,并且它们将从0开始。
// use elements 2 to 7 to create new array
$array = array_values(array_slice($array, 2, 7, true));
//$array = array_slice($array, 2, 7, true);
答案 1 :(得分:0)
使用array_diff_key
函数,它可以找到第一个数组中的键,而不是所传递的第二个数组中的键。进一步了解http://php.net/manual/en/function.array-diff-key.php。 array_slice
函数仍保留其数组的初始键。
这可以通过两种方式解决:
如果您对值比键更感兴趣,请用array_diff_key
函数代替array_diff
函数。它将考虑改为值而不是键。 (推荐-节省性能)
将array_values
函数与array_slice
函数一起使用,以重新为切片数组重新编制索引。
答案 2 :(得分:0)
假设您不关心订单(我在您的开奖中翻转了一对数字):
Account.left_outer_joins(:month_forecasts).select('accounts.*, month_forecasts.*')
.where(month_forecasts: { field: :value }).order('f1, month_forecasts.f2')
输出:
<?php
$array = array(1974, 13/12/2018, 1, 17, 22, 36, 39, 42);
$slice = array_slice($array, -6);
$draws = array(17, 1, 22, 36, 39, 42);
function same_values(array $one, array $two)
{
sort($one);
sort($two);
return $one === $two;
}
var_dump(same_values($slice, $draws));
var_dump(same_values([], []));
var_dump(same_values([1], [1,1]));
var_dump(same_values([1,2], [2,1]));
var_dump(same_values(['a' => 1, 'b' => 2], ['c' => 2, 'b' => 1]));
var_dump(same_values(['a' => '1', 'b' => '2'], ['c' => 2, 'b' => 1]));