这是我第三次发布有关此主题的内容。用户Baba每次都帮助我。由于SO网站没有用户消息系统 - 不幸的是 - 我在帖子中提问。试。
在用户Baba的帮助下,我们设法创建了一个函数,用于检查数组是否包含另一个数组,但该函数多次确定它并创建索引列表。函数缺少的东西,我需要知道的是函数在预期的异常中不返回-1。函数可能返回不相关的值,并且函数不一致。我们只需要检查哪些数组与主数组匹配($ leftArray)并返回这些数组的索引。如果没有任何匹配的数组,则该函数必须返回-1。
请查看此代码并帮助我:
<?php
$leftArray = array(7,6,14,15,8,0,1,4,5,9);
//contains $GroupOfFour[6] and $GroupOfFour[1], and some excess
//numbers. Function should return array(6,1), If there is not a
//matching case the function should return -1.
//i've realised that the exception cases and the multiple
//grouping does not work.
$GroupOfFour = array (
array(3,2,7,6),
array(7,6,15,14),
array(15,14,11,10),
array(1,3,5,7),
array(5,7,13,15),
array(13,15,9,11),
array(0,1,4,5),
array(4,5,12,13),
array(12,13,8,9),
array(0,4,12,8),
array(1,5,13,9),
array(3,7,15,11),
array(2,6,14,10),
array(0,1,3,2),
array(4,5,7,6),
array(12,13,15,14),
array(8,9,11,10),
array(0,2,8,10),
array(0,1,8,9),
array(1,3,9,11),
array(3,2,11,10),
array(0,4,2,6),
array(4,12,6,14),
array(12,14,8,10)
);
function searchFourTerms($leftArray, $GroupOfFour) {
global $GroupOfFour, $leftArray;
$len4 = count($leftArray);
$len4_carry = count($leftArray);
$list4 = array();
for($i4 = 0; $i4 < count($GroupOfFour); $i4 ++) {
$intercept4 = array_intersect($GroupOfFour[$i4], $leftArray);
$len4 = count($intercept4);
if (count($intercept4) % 4 == 0) {
$list4[$i4] = $len4;
}
}
arsort($list4);
if (empty($list4) || ($len4_carry<4))
return - 1;
return key($list4);
}
?>
答案 0 :(得分:2)
key($ list4)只返回list4的当前索引。在你的情况下,它将返回18.
试试这个,它对我有用。我没有返回键($ list4),而是返回了一组匹配的索引。
function searchFourTerms($la, $gof) {
$i3=0;
if(count($la)<4){
return -1;
}
$list4 = array();
for($i4 = 0; $i4 < count($gof); $i4++) {
$intercept4 = array_intersect($gof[$i4], $la);
$len4 = count($intercept4);
if(count($intercept4)==4) {
$list4[$i3] = $i4;
$i3++;
}
}
if (empty($list4)){
return - 1;
}
$list5= array();
$i7=0;
for($i4=0; $i4<count($list4); $i4++){
$i6=0;
for($i5=0; $i5<count($list4); $i5++){
if($i4!=$i5){
$i6+=count(array_intersect($gof[$i4], $gof[$i5]));
}
}
if($i6<count($gof[$i4])){
$list5[$i7]=$list4[$i4];
$i7++;
}
}
return $list5;
}
如果$ leftArray = array(0,1,3,2,7,6,8,9),在返回的数组上执行var_dump会打印以下数组,这将排除[13],因为它包含[来自[]的所有重复项。 0]和[18]:
array(2) {
[0]=>
int(0)
[1]=>
int(18)
}
答案 1 :(得分:0)
这就是你需要返回超过1个键
var_dump(searchFourTerms($leftArray, $GroupOfFour));
输出(所有组使用array_slice选择任何2)
array
0 => int 18
1 => int 1
2 => int 14
3 => int 6
4 => int 20
您修改过的功能
function searchFourTerms($leftArray, $GroupOfFour) {
$len4 = count($leftArray);
$len4_carry = count($leftArray);
$list4 = array();
for($i4 = 0; $i4 < count($GroupOfFour); $i4 ++) {
$intercept4 = array_intersect($GroupOfFour[$i4], $leftArray);
$len4 = count($intercept4);
if (count($intercept4) % 4 == 0) {
$list4[$i4] = $len4;
}
}
arsort($list4);
if (empty($list4) || ($len4_carry < 4))
return - 1;
return array_keys($list4);
}
答案 2 :(得分:0)
我已重命名了输入变量并减少了MCVE中的数据量。
您只需要执行迭代的array_intersect()
调用。如果未声明输出数组,则返回-1
。
代码:(Demo)
$haystack = [7, 6, 14, 15, 8, 0, 1, 4, 5, 9];
$needles = [
[3, 2, 7, 6],
[7, 6, 15, 14],
[15,14,11,10],
[1,3,5,7],
[5,7,13,15],
[13,15,9,11],
[0,1,4,5],
[4,5,12,13],
];
function getIndexOfMatchingArrays(array $needles, array $haystack) {
if (!$haystack) {
return -1;
}
foreach ($needles as $index => $needle) {
if ($needle === array_intersect($needle, $haystack)) {
$fullMatch[] = $index;
}
}
return $fullMatch ?? -1;
}
var_export(
getIndexOfMatchingArrays($needles, $haystack)
);
输出:
array (
0 => 1,
1 => 6,
)