Program Tip

아직없는 경우 배열에 추가

programtip 2020. 12. 9. 21:39
반응형

아직없는 경우 배열에 추가


요소가 아직없는 경우에만 배열에 요소를 추가하는 방법은 무엇입니까? 다음이 있습니다.

$a=array();
// organize the array
foreach($array as $k=>$v){
    foreach($v as $key=>$value){
        if($key=='key'){
        $a[]=$value;
        }
    }
}

print_r($a);

// 출력

Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 1
[4] => 2
[5] => 3
[6] => 4
[7] => 5
[8] => 6

)

대신 $ a가 고유 한 값으로 구성되기를 원합니다. (나는 array_unique를 사용하여 원하는 결과를 얻을 수 있다는 것을 알고 있지만 알고 싶습니다.)


in_array 에 대해 각 값을 확인해야합니다 .

$a=array();
// organize the array by cusip
foreach($array as $k=>$v){
    foreach($v as $key=>$value){
        if(!in_array($value, $a)){
        $a[]=$value;
        }
    }
}

PHP 기능을 사용해야합니다 in_array( http://php.net/manual/en/function.in-array.php 참조 ).

if (!in_array($value, $array))
{
    $array[] = $value; 
}

이것은 문서에서 다음과 같이 말합니다 in_array.

needle이 배열에서 발견되면 TRUE를 반환 하고 그렇지 않으면 FALSE를 반환합니다.


스칼라 값만 있는 것 같기 때문에 PHP의 배열은 오히려 해시 맵이므로 값을 키로 사용하여 중복을 방지하고 $k키를 연결 하여 원래 값을 얻을 수 있습니다.

$keys = array();
foreach ($array as $k => $v){
    if (isset($v['key'])) {
        $keys[$value] = $k;
    }
}

그런 다음 원래 값을 얻기 위해 반복하면됩니다.

$unique = array();
foreach ($keys as $key) {
    $unique[] = $array[$key]['key'];
}

이것은 아마도 가장 분명하고 가장 포괄적 인 접근 방식은 아니지만 O ( n ) 에서와 같이 매우 효율적 입니다.

in_array다른 사람들이 제안한 것처럼 대신 사용 하는 것이 더 직관적 일 수 있습니다. 그러나 적용되지 않는 O ( n 2 ) ( in_arrayis in O ( n )) 의 알고리즘으로 끝날 것입니다 . 배열의 모든 값을 푸시하고 사용 array_unique하는 것보다 in_array( array_uniqueO ( n · log n ) 의 값을 정렬 한 다음 연속적인 중복을 제거 하는 것보다 낫습니다 ).


if (!in_array(...))  
  array_push(..)

작성하기 쉽지만 가장 효과적인 것은 아닙니다.

$array = array_unique(array_merge($array, $array_to_append));

이것은 아마도 더 빠를 것입니다.

$array = array_merge($array, array_diff($array_to_append, $array));

if (!in_array($value, $a))
  $a[]=$value;

키 순서에 신경 쓰지 않는다면 다음을 수행 할 수 있습니다.

$array = YOUR_ARRAY
$unique = array();
foreach ($array as $a) {
    $unique[$a] = $a;
}

값 대신 키로 추가해보세요.

항목 추가

function addEntry($entry) {
    $this->entries[$entry] = true;
}

모든 항목 가져 오기

function getEntries() {
    return array_keys($this->enties);
}

원하는 결과를 달성하는 방법이 많고 많은 사람들 !in_array()이 답변을 제공 했으며 OP는 이미 사용에 대해 언급 했기 때문에 array_unique몇 가지 대안을 제공하고 싶습니다.

사용 array_diff(PHP> = 4.0.1 || 5)이 존재하지 않는 경우에만 새로운 배열 값을 필터링 할 수 있습니다. 또는 키와 값을 array_diff_assoc. http://php.net/manual/en/function.array-diff.php

$currentValues = array(1, 2);
$newValues = array(1, 3, 1, 4, 2);
var_dump(array_diff($newValues, $currentValues));

결과:

Array
(
    [1] => 3
    [3] => 4
)

http://ideone.com/SWO3D1

또 다른 방법은를 사용 array_flip하여 값을 키로 할당하고를 사용하여 비교 isset하는 것입니다. 이는 in_array대규모 데이터 세트 보다 훨씬 빠르게 수행됩니다 . 다시 이것은 현재 값에 아직 존재하지 않는 새 값만 필터링합니다.

$currentValues = [1, 2];
$newValues = [1, 3, 1, 4, 2];
$a = array();
$checkValues = array_flip($currentValues);
foreach ($newValues as $v) {
    if (!isset($checkValues[$v])) {
        $a[] = $v;
    }
}

결과:

Array
(
    [0] => 3
    [1] => 4
)

http://ideone.com/cyRyzN

두 방법 중 하나를 사용 array_merge하여 고유 한 새 값을 현재 값에 추가 할 수 있습니다 .

  1. http://ideone.com/JCakmR
  2. http://ideone.com/bwTz2u

결과:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)

"in_array"를 사용해 볼 수 있습니다.

function insert_value($value, &$_arr) {
    if (!in_array($value, $_arr)) {
        $_arr[] = $value;
    }
}

( 일부 코딩 표준이 권장하는 것처럼 명시 적 블록 을 작성하는 대신) 코드에 속기 를 사용하는 것이 괜찮다면 다음 한 줄로 Marius Schulz의 대답더욱 단순화 할 수 있습니다 .if

in_array ($value, $array) || $array [] = $value;

촬영 검보의 아이디어를 코드 작업을 만들기 :

$array = array('111111','222222','3333333','4444','5555', 
'AAAAAA', 'BBBBBB', 'CCC', 'DDDDDDD', 'EEEEEEEE', 'FFFFFF', 'GGG',
'AAAAAA', 'BBBBBB', 'CCC', 'DDDDDDD', 'EEEEEEEE', 'FFFFFF', 'GGG',
'222222', 
'666666', '777777', 'HHHH');

print_r($array);

$keys= array();
foreach ($array as $k => $v){
    if (isset($v['value'])) {
        $keys[$v] = $k;
    }
}
$unique = array();
foreach ($keys as $key) {
    $unique[] = $array[$key];
}
print "<br><br>";
print_r($unique);

다음을 제공합니다.

Array
(
    [0] => 111111
    [1] => 222222
    [2] => 3333333
    [3] => 4444
    [4] => 5555
    [5] => AAAAAA
    [6] => BBBBBB
    [7] => CCC
    [8] => DDDDDDD
    [9] => EEEEEEEE
    [10] => FFFFFF
    [11] => GGG
    [12] => AAAAAA
    [13] => BBBBBB
    [14] => CCC
    [15] => DDDDDDD
    [16] => EEEEEEEE
    [17] => FFFFFF
    [18] => GGG
    [19] => 222222
    [20] => 666666
    [21] => 777777
    [22] => HHHH
)

Array
(
    [0] => 111111
    [1] => 222222
    [2] => 3333333
    [3] => 4444
    [4] => 5555
    [5] => AAAAAA
    [6] => BBBBBB
    [7] => CCC
    [8] => DDDDDDD
    [9] => EEEEEEEE
    [10] => FFFFFF
    [11] => GGG
    [12] => 666666
    [13] => 777777
    [14] => HHHH
)

더 좋고 더 간단한 기본 방법 :

$array = $array_1 + $array_2;

참조 : 배열 연산자 : 공용체.


이 코드를 사용해보세요. 여기 에서 가져 왔습니다.

$input = Array(1,2,3,1,2,3,4,5,6);
$input = array_map("unserialize", array_unique(array_map("serialize", $input)));

참고 URL : https://stackoverflow.com/questions/6083567/add-to-array-if-it-isnt-there-already

반응형