Как проверить, что массив дал ключи - PullRequest
0 голосов
/ 16 июня 2019

С точки зрения производительности, как лучше всего проверить, есть ли у связанного массива только данный набор ключей?Тот же вопрос, но с точки зрения краткости кода?

function checkArrKeys(array $arr, array $keys):bool {
    $arrKeys=array_keys($arr);
    sort($arrKeys);
    sort($keys);
    return $arrKeys===$keys;
}

function checkArrKeys(array $arr, array $keys):bool {
    return ($cnt = count(array_intersect(array_keys($arr), $keys)))===count($arr) && $cnt===count($keys);
}

function checkArrKeys(array $arr, array $keys):bool {
    return !(array_diff_key($arr, array_flip($keys)) || array_diff_key(array_flip($keys), $arr));
}

Ответы [ 4 ]

1 голос
/ 16 июня 2019

Не уверен насчет производительности, но это один из способов.
Объедините ключи с array_keys и посчитайте значения.
Затем удалите все, что имело значение 2, если что-то осталось, есть разница.

$merged = array_diff(array_count_values(array_merge($keys, array_keys($arr))), [2]);

https://3v4l.org/ATSHF

0 голосов
/ 16 июня 2019

Просто сравните их :

function checkArrKeys(array $arr, array $keys):bool {
    $arrayKeys = array_keys($arr);
    sort($arrayKeys);

    return $arrayKeys === $keys; // 
}

$a = ['a'=>1, 'b'=>2, 'c'=>3, 'd'=>4];
$A = ['b'=>2, 'c'=>3, 'd'=>4, 'a'=>1];

$b = ['a'=>1, 'b'=>2, 'c'=>3];
$c = ['a'=>1, 'b'=>2, 'c'=>3, 'd'=>4, 'e'=>5];


$keys = ['a','b','c', 'd'];
var_dump(array_keys($a)===$keys); // true
var_dump(array_keys($A)===$keys); // false
var_dump(array_keys($b)===$keys);  // false
var_dump(array_keys($c)===$keys);  // false

function checkArrKeys(array $arr, array $keys):bool {
    $arrayKeys = array_keys($arr);
    sort($arrayKeys);

    return $arrayKeys === $keys; // 
}
echo "\n";

var_dump(checkArrKeys($a, $keys)); // true
var_dump(checkArrKeys($A, $keys)); // true
var_dump(checkArrKeys($b, $keys)); // false
var_dump(checkArrKeys($c, $keys)); // false

Попробуйте онлайн

0 голосов
/ 16 июня 2019

Вы можете использовать array_diff() для этого с проверкой count().

function checkArrKeys(array $arr, array $keys):bool {
    return count(array_diff(array_keys($arr),$keys)) === 0 && count($keys) === count(array_keys($arr));
}
0 голосов
/ 16 июня 2019

Вы можете сделать это просто,

 function ArrayKeysAreEqual(array $keys, array $arr)
 {
    return array_diff(array_keys($arr), $keys) === array_diff($keys, array_keys($arr)); // return true if matches
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...