Я буду сравнивать два массива. $db
это первый массив и $tr
это второй массив. $tr
сравнивать с$db
, если значение $tr
в $db
, затем $result
содержит значение $tr
:
Первый массив $db
$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
$tr = [
['a','b'],
['a','c'], //in
['a','d'], //in
['b','c'],
['b','d'], //in
['c','d'],
];
если $db
а также $tr
чем это производит
будут результаты $result
как это:
$result = [
['a','c'],
['a','d'],
['b','d']
];
Счастливого Рождества!
Я не думаю, что 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);
function compare($db, $tr)
{
$result = [];
foreach ($db as $val) {
$dbformat[] = implode("", $val);
}
foreach ($tr as $val) {
$pattern = "";
foreach($val as $one) {
$pattern .= $one.".*?";
}
foreach ($dbformat as $value) {
$countMatch = preg_match("/".$pattern."/", $value);
if($countMatch) {
$result[] = $val;
break;
}
}
}
return $result;
}