如何防止array_push中的重复键

时间:2022-06-03 23:08:17

I have 2 2D arrays, how can i get the unique keys and only push those? For example:

我有2个2D数组,我怎么能得到唯一的键而只推它们呢?例如:

$array = json_decode('[{"7654321":1368356071},{"1234567":1368356071}]',true);
$array2 = array(array(1234567 => time()), array(7654321 => time()), array(2345678 => time()));
//array_push($array, $array2[2]); 

-- How can I dynamically get the unique key like $array2[2] in this example?

在本例中,如何动态地获取像$array2[2]这样的唯一键?

2 个解决方案

#1


3  

why not to use array_unique() function in php? http://php.net/manual/ru/function.array-unique.php

为什么不在php中使用array_unique()函数呢?http://php.net/manual/ru/function.array-unique.php

#2


1  

You mean, you would like to push into another array (let's say in $keys_unique) whatever key(s) that are present only in one of the first two arrays, but not present in both of them?

您的意思是,您想要插入到另一个数组(比如$keys_unique)中,任何只出现在前两个数组中的键,而不是在两个数组中出现的键?

Try this:

试试这个:

$arrays_mixed = array(  //your $array and $array2; you can put as many arrays as you want here
     json_decode('[{"7654321":1368356071},{"1234567":1368356071}]',true)
    ,array(array(1234567 => time()), array(7654321 => time()), array(2345678 => time()))
);

//begin getting all keys
$arrays_keys = array(); //will hold all keys from arrays_mixed
$keys_unique = array(); //will hold all unique keys out of arrays_key
for($x=0;$x<count($arrays_mixed);$x++){
    $arrays_keys[$x] = array(); //prepares a "keys holder"
    $toflatten = $arrays_mixed[$x];
    $c1 = 0;
    do{
        $arrmixed = array();
        $arrclean = array();
        foreach($toflatten as $a){
            $arrmixed = $this->keys_finder($a,1);
            $arrclean[$c1] = $this->keys_finder($a,2);
            $c1++;
        }
        $toflatten = $arrmixed;
    }while(is_array($toflatten));
    for($c2=0;$c2<$c1;$c2++)
        foreach($arrclean[$c2] as $ac)
            array_push($arrays_keys[$x],$ac);
}//end geting all keys

//begin finding unique keys
foreach($arrays_keys as $ak)
    foreach($ak as $add)
        $keys_unique = $this->unique_inserter($arrays_keys,$keys_unique,$add);
//end finding unique keys

Here are the functions you need

这是你需要的函数

function unique_inserter($arrays_keys,$keys_unique,$add){
    $detector = 0;  //detects how many arrays contain a value
    foreach($arrays_keys as $ak)
        if(in_array($add,$ak))
            $detector++;
    if($detector<2) //if value is found in one array only
        array_push($keys_unique,$add);
    return $keys_unique;
}
function keys_finder($array,$return){
    $arrmixed = array();
    $arrclean = array();
    foreach($array as $key=>$a)
        if(is_array($a))
            foreach($a as $aa)
                array_push($arrmixed,$aa);
        else
            array_push($arrclean,$key);
    switch($return){
        case 1:
            return (count($arrmixed)==0)?'':$arrmixed;
            break;
        case 2:
            return $arrclean;
            break;
    }
}

I have tested this code and it works on my side. Hope it helps.

我已经测试了这段代码,它在我这边工作。希望它可以帮助。

#1


3  

why not to use array_unique() function in php? http://php.net/manual/ru/function.array-unique.php

为什么不在php中使用array_unique()函数呢?http://php.net/manual/ru/function.array-unique.php

#2


1  

You mean, you would like to push into another array (let's say in $keys_unique) whatever key(s) that are present only in one of the first two arrays, but not present in both of them?

您的意思是,您想要插入到另一个数组(比如$keys_unique)中,任何只出现在前两个数组中的键,而不是在两个数组中出现的键?

Try this:

试试这个:

$arrays_mixed = array(  //your $array and $array2; you can put as many arrays as you want here
     json_decode('[{"7654321":1368356071},{"1234567":1368356071}]',true)
    ,array(array(1234567 => time()), array(7654321 => time()), array(2345678 => time()))
);

//begin getting all keys
$arrays_keys = array(); //will hold all keys from arrays_mixed
$keys_unique = array(); //will hold all unique keys out of arrays_key
for($x=0;$x<count($arrays_mixed);$x++){
    $arrays_keys[$x] = array(); //prepares a "keys holder"
    $toflatten = $arrays_mixed[$x];
    $c1 = 0;
    do{
        $arrmixed = array();
        $arrclean = array();
        foreach($toflatten as $a){
            $arrmixed = $this->keys_finder($a,1);
            $arrclean[$c1] = $this->keys_finder($a,2);
            $c1++;
        }
        $toflatten = $arrmixed;
    }while(is_array($toflatten));
    for($c2=0;$c2<$c1;$c2++)
        foreach($arrclean[$c2] as $ac)
            array_push($arrays_keys[$x],$ac);
}//end geting all keys

//begin finding unique keys
foreach($arrays_keys as $ak)
    foreach($ak as $add)
        $keys_unique = $this->unique_inserter($arrays_keys,$keys_unique,$add);
//end finding unique keys

Here are the functions you need

这是你需要的函数

function unique_inserter($arrays_keys,$keys_unique,$add){
    $detector = 0;  //detects how many arrays contain a value
    foreach($arrays_keys as $ak)
        if(in_array($add,$ak))
            $detector++;
    if($detector<2) //if value is found in one array only
        array_push($keys_unique,$add);
    return $keys_unique;
}
function keys_finder($array,$return){
    $arrmixed = array();
    $arrclean = array();
    foreach($array as $key=>$a)
        if(is_array($a))
            foreach($a as $aa)
                array_push($arrmixed,$aa);
        else
            array_push($arrclean,$key);
    switch($return){
        case 1:
            return (count($arrmixed)==0)?'':$arrmixed;
            break;
        case 2:
            return $arrclean;
            break;
    }
}

I have tested this code and it works on my side. Hope it helps.

我已经测试了这段代码,它在我这边工作。希望它可以帮助。