Rumah > Soal Jawab > teks badan
$listData = [ '111' => ['a', 'b', 'c', 'a'], '222' => ['d', 'e', 'f', 'f', 'b'], '333' => ['g', 'h'], '444' => ['i', 'j'], ... ];
定义一个函数,传入$listData
如果111里面的元素,和 222/333/444... 里面的元素有重复,返回false
如果222里面的元素,和 111/333/444... 里面的元素有重复,返回false
如果333里面的元素,和 111/222/444... 里面的元素有重复,返回false
如果 ...
允许 111/222/333/444 自己里面的元素重复,返回true 其他情况返回true
已知:
$listData长度未知
111/222/333/444... 的长度未知
111/222/333/444... 里的元素为字符串和数字
我自己实现了一下,感觉算法很糟,请问有没有其他方法
function test ($array) { $tempValueList = []; foreach ($array as $key => $valueList) { foreach ($valueList as $value) { $tempValueList[] = $key . '~' . $value; } } $result = true; foreach ($array as $key => $valueList) { foreach ($valueList as $value) { foreach ($tempValueList as $_value) { $pos = strpos($_value, '~'); $_key = substr($_value, 0, $pos); $_val = substr($_value, $pos + 1); if ($key == $_key) { continue; } if ($_val == $value) { $result = false; break 3; } } } } return $result; }
欧阳克2016-11-19 13:21:43
不知道是不是这样:
$new_arr = []; foreach ($listData as $key => $value) { foreach ($value as $k => $v) { $kv = $k . $v; if (in_array($kv, $new_arr)) { echo '有重复';exit; } else { $new_arr[] = $kv; } } }
三叔2016-11-19 13:21:11
循环一次,当前元素和其它所有元素求交集,代码如下:
function isExistsInOther($data) { $temp = []; $isExists = true; foreach ($data as $key=>$value) { $temp = $data; unset($temp[$key]); if(!$isExists) break; @array_walk($temp,function($v,$k) use($value,&$isExists){ if($isExists) { $intersect = array_intersect($v,$value); if(!empty($intersect)) { $isExists = false; } } }); } return $isExists; } $listData = [ '111' => ['a', 'k', 'c', 'a'], '222' => ['d', 'e', 'f', 'f', 'b'], '333' => ['g', 'e'], '444' => ['i', 'j'] ]; $result = isExistsInOther($listData); var_dump($result); //true 无交集 //false 有交集