3

配列を出力するために次のコードの平和を使用しています:

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から1つの要素だけで配列を取得しますか?

4

4 に答える 4

11

配列要素は比較のために文字列にキャストされます-これはarray_uniqueのマニュアルページからの関連スニペットです

注:(string)$ elem1 ===(string)$ elem2の場合に限り、2つの要素は等しいと見なされます。つまり、文字列表現が同じ場合。最初の要素が使用されます。

配列要素が文字列にキャストされると、値は「Array」になります。これにより、もちろんすべての要素が同じように見え、最初の要素だけになります。

これがあなたのような配列から重複を取り除くことができる1つの方法です

$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
于 2009-09-10T07:00:39.600 に答える
3

$ selectedは多次元配列であるため、$selected[0]は$selected[1]という配列と同じだと思います。

私の知る限り、array_uniqueは(string)$ value1 ===(string)$ value2をテストするため、'Array'=='Array'を取得します。

要素を「一意」(URI?)にする理由を実際に説明していません。構造全体を比較するには、$ selectedをループして値をシリアル化し(serialize()を使用)、それらの値に対してarray_uniqueを呼び出すことをお勧めします。次に、unserializeを呼び出して、配列を通常の状態に戻します。

<?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

于 2009-09-10T07:14:45.177 に答える
2

array_uniqueは、要素の文字列値を比較することにより、重複を削除します。配列の文字列値は、配列の内容に関係なく、常に「Array」です。

これは、配列のすべての要素が文字列値 "Array"を持っているため、重複していると見なされ、最初の要素を除いて削除されることを意味します。

要素の「uri」を比較することで機能する独自のarray_unique関数を作成する必要があります。

于 2009-09-10T07:02:24.807 に答える
0

配列要素がすでに並べ替えられている場合は、次のようにして一意の値を見つけることができます。

$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];
    }
}
于 2009-09-10T07:22:19.457 に答える