一个php的面试题,大家看看

$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;
}
阅读 2.3k
评论
    16 个回答
    • 972
    /**
     * [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);
      相似问题
      推荐文章