Два PHP-массива, неустановленные позиции, которые присутствуют только в одном массиве
У меня есть два массива (в PHP):
ArrayA
(
[0] => 9
[1] => 1
[2] => 2
[3] => 7
)
ArrayB
(
[0] => 1
[1] => 1
[3] => 8
)
Я хочу создать два новых массива, в которых у меня есть только элементы, объявленные в обоих массивах, например:
ArrayA
(
[0] => 9
[1] => 1
[3] => 7
)
ArrayB
(
[0] => 1
[1] => 1
[3] => 8
)
В этом примере ArrayA[2] не существует, поэтому ArrayB[2] не установлен.
Я написал это для цикла:
for ($i = 0, $i = 99999, $i++){
if (isset($ArrayA[$i]) AND isset($ArrayB[$i]) == FALSE)
{
unset($ArrayA[$i],$ArrayB[$i]);
}
}
Но это не очень хорошо, потому что он пытается каждый индекс между 0 и очень большим числом (в нашем случае 99999). Как я могу улучшить свой код?
4 ответа
Функция, которую вы ищете, это array_intersect_key:
array_intersect_key () возвращает массив, содержащий все записи array1, ключи которых присутствуют во всех аргументах.
Поскольку вам нужны оба массива, вам придется запускать их дважды, с параметрами в противоположных порядках, так как он сохраняет ключи только от первого массива. Пример:
$arrayA_filtered = array_intersect_key($arrayA, $arrayB);
$arrayB_filtered = array_intersect_key($arrayB, $arrayA);
Кроме того, хотя цикл for не был идеальным в этом случае, в других случаях, когда вам нужно циклически проходить через разреженный массив (в котором задано не каждое число), вы можете использовать цикл foreach:
foreach($array as $key => $value) {
//Do stuff
}
foreach($arrayA as $k=>$a)
if (!isset($arrayB[$k]))
unset($arrayA[$k];
Одна очень важная вещь, которую стоит отметить в PHP-массивах, это то, что они ассоциативны. Вы не можете просто использовать цикл for, поскольку индексы не обязательно представляют собой диапазон целых чисел. Подумайте, что произойдет, если вы примените этот алгоритм дважды! Вы бы вышли за пределы ошибок как $arrayA[2]
а также $arrayB[2]
Больше не существует!
Я бы перебрал массивы, используя вложенные foreach
заявления. Т.е.
$outputA = array();
$outputB = array();
foreach ($arrayA as $keyA => $itemA) {
foreach ($arrayB as $keyB => $itemB) {
if ($keyA == $keyB) {
$outputA[$keyA] = $itemA;
$outputB[$keyB] = $itemB;
}
}
Это должно дать вам два массива, $outputA
а также $outputB
, которые выглядят так же, как $arrayA
а также $arrayB
за исключением того, что они включают пары ключ => значение, только если ключ присутствовал в обоих исходных массивах.
Посмотрите на php: array_diff