С Рождеством!
Я не думаю, что у PHP есть стандартная функция для решения этой проблемы (хотя я, возможно, пропустил ее для вас). Существует множество функций массива, но большинство из них не работают на вложенных массивах или выполняют определенную задачу.
Но, как правило, легко написать функцию самостоятельно, используя, если можно, встроенные функции.
Функция ниже итерации над каждым элементом в $ tr. Для каждого элемента он выполняет итерации над элементами $ dm. Затем он использует array_diff
, чтобы получить список элементов, отсутствующих в элементе dm. Если этот список пуст, это означает, что все элементы из первого массива содержатся во втором массиве, а первый массив должен быть в результате.
я заметил, эта функция также возвращает в результате ['c', 'd']
, потому что c
и d
оба содержатся в одном из массивов $dm
. Так что, возможно, вы пропустили это, или я не понял спецификации правильно. Во всяком случае, это должно вам начать работу по крайней мере:
<?php
$db = [
['a','d'],
['a','e','f'],
['g'],
['b','e','d'],
['a','d','c','e'],
['d','g'],
['c','a','h','e','f','h'],
['g','e','h'],
['d','f','b','h','g']
];
$tr = [
['a','b'],
['a','c'], //in
['a','d'], //in
['b','c'],
['b','d'], //in
['c','d'],
];
function nested_array_intersect($source, $comparewith) {
$result = array();
foreach ($source as $sItem) {
foreach ($comparewith as $cwItem) {
$missingItems = array_diff($sItem, $cwItem);
if (count($missingItems) === 0) {
$result[] = $sItem;
break;
}
}
}
return $result;
}
$result = nested_array_intersect($tr, $db);
print_r($result);
Что такое ваше определение «содержит»? У меня есть фрагмент кода, который я бы хотел опубликовать, но он также добавляет '['c', 'd']' к результату, потому что 'c' и 'd' содержатся в '['a', 'd', 'c', 'e'] '. Это правильно? – GolezTrol
например: ['a', 'b'] находится в ['a', 'd', 'b'], затем в переменную $ result добавляется ['a', 'b']. –