Php 返回数组的第一个重复元素的最佳方法

Php 返回数组的第一个重复元素的最佳方法,php,arrays,Php,Arrays,这是一个采访问题: 返回整数数组中第一个重复元素的最佳方法是什么? 例如: 给定一个数组[12,46,244,0,12,83,48,98,233,83,26,91,119,148,98] 本例中的返回值为12 如何做到这一点呢?我认为,如果从性能上看,foreach循环是最重要的 这将为您提供所有重复值及其原始位置: $diff = array_diff_assoc($array, array_unique($array)); var_dump($diff); 结果: array(3) {

这是一个采访问题:

返回整数数组中第一个重复元素的最佳方法是什么?

例如:

给定一个数组
[12,46,244,0,12,83,48,98,233,83,26,91,119,148,98]

本例中的返回值为
12


如何做到这一点呢?

我认为,如果从性能上看,foreach循环是最重要的


这将为您提供所有重复值及其原始位置:

$diff = array_diff_assoc($array, array_unique($array));
var_dump($diff);
结果:

array(3) { 
  [4]=> int(12) 
  [9]=> int(83)
  [14]=> int(98) 
} 
.

您可以使用删除所有重复值,然后迭代原始数组和结果数组,并返回结果数组中未出现的第一个值。大概是这样的:

$arr = array(12, 46, 244, 0, 12, 83, 48, 98, 233, 83, 26, 91, 119, 148, 98);

function first_dupe($arr) {
    $res = array_unique($arr);

    foreach ($arr as $key => $val) {
        if ($res[$key] !== $val)
            return $val;
    }
}

echo first_dupe($arr);

工作演示:.

使用递归的无环解决方案。我认为这将是最快的,但需要更多的内存。快速,因为随着我们的前进,阵列的大小不断减小,所以cpu上的工作负载减少

 $data = array(46, 12, 244, 0, 12, 83, 48, 98, 233, 83, 26, 91, 119, 148, 98);


    function find(&$input)
    {
    $current = array_shift($input);
    if(in_array($current,$input))
    {
    return $current;
    }
    return find($input);
    }

    echo find($data);
这里N是数组的大小,A是数组,
步骤1:将N添加到值的索引中
第二步:遍历数组,找到第一个有频率的数字
大于1个断点。
O(n)与O(1)大小复杂度!

对于(int i=0;i,或者可以使用array\u count\u values()函数获取该值

    $arr = array(12, 46, 244, 0, 12, 83, 48, 98, 233, 83, 26, 91, 119, 148, 98);
    $freq_arr = array_count_values($arr);

    echo $freq_arr[0];

请参阅PHP手册。

问题是什么?当然,您不是指
return 12;
return$array[0];
请现在查看问题……希望您能澄清,实际上有什么算法可以找到这个问题吗?函数firstDuplicate($a){$array=[];foreach($a as$key=>$value){if(isset($array[$value]))返回$value;否则$array[$value]=true;}返回-1;}我同意,如果你只需要第一个,那么使用foreach的其他解决方案会更快。这是我见过的最好的解决方案。请记住,函数调用在PHP中很慢。@thereformhere这里的一切最终归结为函数:)回答得好,我唯一不喜欢的是你使用了“1”值,而不是直接使用数组值
$arr = array(12, 46, 244, 0, 12, 83, 48, 98, 233, 83, 26, 91, 119, 148, 98);

function first_dupe($arr) {
    $res = array_unique($arr);

    foreach ($arr as $key => $val) {
        if ($res[$key] !== $val)
            return $val;
    }
}

echo first_dupe($arr);
$testData = array(46, 12, 244, 0, 12, 83, 48, 98, 233, 83, 26, 91, 119, 148, 98);

function repeated($val) {
    return $val > 1;
}

$firstRepeatedElement = array_shift(array_keys(array_filter(array_count_values($testData),'repeated')));
 $data = array(46, 12, 244, 0, 12, 83, 48, 98, 233, 83, 26, 91, 119, 148, 98);


    function find(&$input)
    {
    $current = array_shift($input);
    if(in_array($current,$input))
    {
    return $current;
    }
    return find($input);
    }

    echo find($data);
$arrs = array(12, 46, 244, 0, 12, 83, 48, 98, 233, 83, 26, 91, 119, 148, 98);

static $repeat  = '';

foreach($arrs as $arr) {

   if ((count(array_keys($arrs,$arr))) > 1) {

        $repeat = $arr;
        break;

   }

}

if ($repeat) echo 'The first repeated element out of the array of integers is '.$repeat;


//This solution is working for associate array too, for example:

// $arrs = array('a'=>12, 'b'=>46, 'c'=>244, 'd'=>0, 'e'=>12, 'f'=>83, 'g'=>48, 'h'=>98, 'i'=>233, 'j'=>83, 'k'=>26, 'l'=>91, 'm'=>119, 'n'=>148, 'o'=>98);
$arrs = array(12, 46, 244, 0, 12, 83, 48, 98, 233, 83, 26, 91, 119, 148, 98);

// or a associate array like as $arrs = array('a'=>12, 'b'=>46, 'c'=>244, 'd'=>0, 'e'=>12, 'f'=>83, 'g'=>48, 'h'=>98, 'i'=>233, 'j'=>83, 'k'=>26, 'l'=>91, 'm'=>119, 'n'=>148, 'o'=>98);

$data = "12, 46, 244, 0, 12, 83, 48, 98, 233, 83, 26, 91, 119, 148, 98";

static $repeat  = '';

foreach($arrs as $arr){

   if (substr_count($data,$arr)>1) {

     $repeat = $arr;
     break; 
  }

}

if ($repeat) echo 'The first repeated element out of the array of integers is '.$repeat;
$array = array(12, 46, 46, 0, 18, 83, 48, 98, 233, 83, 26, 91, 119, 148, 98);
$count_array = array_count_values($array);
foreach($count_array as $key=>$value)
{
    if($value>=2)
    {
       echo $key;
       break;
    }

}
$arr = array(12, 46, 244, 0, 12, 83, 48, 98, 233, 83, 26, 91, 119, 148, 98);
$arrHelp = array();
foreach($arr as $int) {
    if (in_array($int, $arrHelp)) {
        echo $int;
        break;
    }
    else {
        array_push($arrHelp, $int);
    }
}
        here N is size of array and A is array,
        step1:add N to index of the value
        step2:traverse the array and find the first number which has frequency 
              greater than 1 break there.

O(n) with O(1) size complexity!

                for(int i=0;i<N;++i)
                        A[A[i]%N]+=N;

                    int val,freq;
                    for(int i=0;i<N;++i)
                    {
                        val=A[i]%N;
                        freq=A[val]%N;
                        if(freq>1)
                        {
                            cout<<val;
                            break;
                        }
                    }
    $arr = array(12, 46, 244, 0, 12, 83, 48, 98, 233, 83, 26, 91, 119, 148, 98);
    $freq_arr = array_count_values($arr);

    echo $freq_arr[0];