문제

다음과 같은 코드의 평화를 사용하여 배열을 출력합니다.

echo "======output without array_unique=====";
var_dump($selected);
echo "=====output with array_unique=====";
var_dump(array_unique($selected));die;                

그리고 출력은 다음과 같습니다.

======output without array_unique=====

array
  0 => 
    array
      'uri' => string 'http://localhost/conferences/tags/0caf4c990e0a385156b33fee58e7e3fb' (length=63)
      'tag' => string '1' (length=1)
      'weight' => float 4
      'selected' => string 'select' (length=6)
  1 => 
    array
      'uri' => string 'http://localhost/conferences/tags/0caf4c990e0a385156b33fee58e7e3fb' (length=63)
      'tag' => string '1' (length=1)
      'weight' => float 4
      'selected' => string 'select' (length=6)
  2 => 
    array
      'uri' => string 'http://localhost/conferences/tags/ffc709d5131f752df8aae22d7da4240f' (length=63)
      'tag' => string '2' (length=1)
      'weight' => float 4
      'selected' => string '' (length=0)
  3 => 
    array
      'uri' => string 'http://localhost/conferences/tags/035c60c7f090412cc905cee008fbeba8' (length=63)
      'tag' => string '3' (length=1)
      'weight' => float 0
      'selected' => string '' (length=0)
  4 => 
    array
      'uri' => string 'http://localhost/conferences/tags/4137dbc16ef1a2079eb6cacb62dd8521' (length=63)
      'tag' => string '4' (length=1)
      'weight' => float 0
      'selected' => string '' (length=0)

=====output with array_unique=====

array
  0 => 
    array
      'uri' => string 'http://localhost/conferences/tags/0caf4c990e0a385156b33fee58e7e3fb' (length=63)
      'tag' => string '1' (length=1)
      'weight' => float 4
      'selected' => string 'select' (length=6)

누군가가 array_unique에서 하나의 요소만으로 배열을 얻는 이유를 설명 할 수 있습니까?

도움이 되었습니까?

해결책

배열 요소는 비교를 위해 문자열로 캐스팅됩니다 - 여기에서 관련 스 니펫이 있습니다. Array_unique의 수동 페이지

참고 : 두 요소는 (문자열) $ elem1 === (문자열) $ elem2 인 경우에만 동일하게 간주됩니다. 말로 : 문자열 표현이 동일 할 때. 첫 번째 요소가 사용됩니다.

배열 요소가 문자열로 캐스팅되면 단순히 "배열"값이 있으므로 모든 요소가 동일하게 보이게하고 첫 번째 요소만으로 감습니다.

다음은 귀하와 같은 어레이에서 중복을 제거 할 수있는 한 가지 방법입니다.

$seen=array();
foreach ($myarray as $key=>$val) {
    if (isset($seen[$val['uri']])) {
        unset($myarray[$key]);    // remove duplicate
    } else {
        $seen[$val['uri']]=$key;  // remember this
    }
}
unset($seen); // don't need this any more

다른 팁

선택된 $ 선택은 다차원 배열이므로 $ 선택된 [0]은 $ 선택한 [1], 배열과 동일하다고 생각합니다.

내가 아는 한, array_unique tests (string) $ value1 === (문자열) $ value2이므로 'array'== 'array'를 얻습니다.

요소가 '고유 한'(URI?)을 만드는 이유를 실제로 설명하지 않았습니다. 전체 구조를 비교하려면 $ 선택한 $를 통해 루프를 시도하고 (Serialize () 사용)를 직렬화 한 다음 해당 값에서 Array_unique를 호출 할 수 있습니다. 그런 다음 Unsserialize를 호출하여 배열을 정상으로 되돌립니다.

<?php

function multi_array_unique($arr) {
    foreach ($arr as &$elm) {
        $elm = serialize($elm);
    }

    $arr = array_unique($arr);

    foreach ($arr as &$elm) {
        $elm = unserialize($elm);
    }

    return $arr;
}

?>

가장 효율적인 솔루션은 아니지만 걱정하기 전에 먼저 벤치마킹 할 것입니다.

보다: http://codepad.org/6cs5b0sm

Array_unique 요소의 문자열 값을 비교하여 복제를 제거합니다. 배열의 문자열 값은 항상 배열의 내용과 무관 한 "배열"입니다.

이는 배열의 모든 요소에 문자열 값 "배열"을 가지므로 중복으로 간주되며 첫 번째 요소를 제외하고는 제거됩니다.

요소의 'Uri'를 비교하여 작동하는 자신의 Array_unique 함수를 작성해야합니다.

배열 요소가 이미 정렬 된 경우 다음과 같이 고유 한 값을 찾을 수 있습니다.

$unique = array();
$n = count($array);
if ($n < 2) {
    $unique = $array;
} else {
    for ($i=0; $i<$n-1; ++$i) {
        $unique[] = $array[$i];
        if ($array[$i] === $array[$i+1]) {
            ++$i;
        }
    }
    if ($i < $n && $array[$n-2] !== $array[$n-1]) {
        $unique[] = $array[$n-1];
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top