I looked at it and found that neither of the previous two answers could be used. LZ is really unlucky.
my definition of a subarray is a single array like ['aarrays,' baked, 'clocked,' a'].
my answer:
$result = array();
foreach ($listData as $line) {
//,
$result[] = array_unique($line);
}
//
//`True`
var_dump(count(array_merge(...$result)) === count(array_unique(array_merge(...$listData))));
my answer is to call system functions more times, which looks more concise, but a large part of the performance of functions such as PHP array_xxx does not have an advantage. If you do not use these functions, you can improve the running efficiency to a relative extent.
currently, @ springhack is the most efficient. And can maintain the highest efficiency in all situations.
Auxiliary reference information that is easy to understand:
Raw data:
$listData = [
'111' => ['a', 'b', 'c', 'a'],
'222' => ['d', 'e', 'f', 'f', 'b'],
'333' => ['g', 'h'],
'444' => ['i', 'j']
];
then $result ends up like this:
$listData = [
'111' => ['a', 'b', 'c'],
'222' => ['d', 'e', 'f', 'b'],
'333' => ['g', 'h'],
'444' => ['i', 'j']
];
result of subarray deduplicating and then merging
Array
(
[0] => a
[1] => b
[2] => c
[3] => d
[4] => e
[5] => f
[6] => b
[7] => g
[8] => h
[9] => i
[10] => j
)
is used to compare the quantity (number of array elements) above, the so-called "result of merging subarrays first and then deduplicating":
Array
(
[0] => a
[1] => b
[2] => c
[4] => d
[5] => e
[6] => f
[9] => g
[10] => h
[11] => i
[12] => j
)
cycle once, and the current element intersects all other elements. The code is as follows:
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
/**
* [checkRepeat key]
* @param [type] $listData []
* @return [type] [array]
*/
function checkRepeat($listData) {
foreach($listData as $key =>$val) {
$check_arr = $listData;
// key
unset($check_arr[$key]);
//
$check_arr = array_merge(...$check_arr);
//
$rs[$key] = count(array_intersect($val, $check_arr)) > 0 ? false : true ;
}
return $rs;
}
$listData = [
'111' => ['a', 'b', 'c', 'a'],
'222' => ['d', 'e', 'f', 'f', 'b'],
'333' => ['g', 'h'],
'444' => ['i', 'j'],
];
$rs = checkRepeat($listData);
function check($arr)
{
$chk = [];
foreach ($arr as $k => $v)
foreach ($v as $i)
{
if (isset($chk[$i] && $chk[$i] != $k)
return false;
$chk[$i] = $k;
}
return true;
}
claw machine codeword, should be the most efficient, debug by yourself.
since all the answers are given above, let me add to you that the multidimensional array is deduplicated
.
/**
*
* @param array
* @return array
*/
function super_unique($array)
{
$result = array_map("unserialize", array_unique(array_map("serialize", $array)));
foreach ($result as $key => $value)
{
if ( is_array($value) ) {
$result[$key] = super_unique($value);
}
}
return $result;
}
Multidimensional Array
my answer (principle: loop intersection):
<?php
$list = [
'111' => ['a', 'b', 'c', 'a'],
'222' => ['d', 'e', 'f', 'f','b'],
'333' => ['g', 'h','c'],
'444' => ['i', 'j']
];
function jiaoji($array){
$listData = array_values($array);
$list = [];
for ($i = 0; $i < count($listData); $iPP) {
for ($j = $i+1; $j < count($listData); $jPP) {
$list[] = array_intersect($listData[$i],$listData[$j]);
}
}
$result = array_filter($list);
return count($result)==0;
}
var_dump(jiaoji($list));//bool(false)
?>
can it be understood in this way that as long as the values in this array intersect with each other, then false is returned. The
array_intersect () function seems to work. But the problem is to change the values in an array into decimal values.
<?php
$listData = [
'111' => ['a', 'b', 'c', 'a'],
'222' => ['d', 'e', 'f', 'f', 'b'],
'333' => ['g', 'h'],
'444' => ['i', 'j'],
...
];
function getArr($listData){
$isUnsetFirstKey = false;
$len = count($listData);
if($len<=1) return false;
$firstKey = key($listData);
$firstArr = array_unique($listData[$firstKey]);
$newList = $listData;
unset($newList[$firstKey]);
foreach ($newList as $key => $val) {
$arr = array_unique($val);
$newarr = array_merge($firstArr,$arr);
if(count($newarr) != count(array_unique($newarr))){
$isUnsetFirstKey = true;
unset($newList[$key]);
echo $key . "<br>";
}
}
if($isUnsetFirstKey) echo $firstKey . "<br>";
getArr($newList);
}
getArr($listData);
?>
< H2 > my answer, take a look, very powerful < / H2 >
An one-dimensional array is similar to a two-dimensional array. To judge internally, here is the method of a two-dimensional array. The one-dimensional array skips
to compare the array length before and after merging (after taking unique)
:
$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;
}
}
}