数组元素未显示为相等

时间:2018-12-20 10:33:07

标签: php arrays

我有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?

3 个答案:

答案 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.phparray_slice函数仍保留其数组的初始键。

这可以通过两种方式解决:

  1. 如果您对值比键更感兴趣,请用array_diff_key函数代替array_diff函数。它将考虑改为值而不是键。 (推荐-节省性能)

  2. 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]));