在寻找一种解决方案来识别数组中的重复项时,我偶然发现了许多依靠 array_count_values
or的解决方案array_unique
。但是所有这些解决方案都不关心数组中的对象。
array_count_values
E_WARNING
为每个不是 astring
或 an 的值抛出一个integer
。
array_unique
如果设置了该选项,则确实会关注具有各种类型的元素SORT_REGULAR
。但是看看下面的用例。
class Foo
{
private $value;
public function __construct( $value )
{
$this->value = $value;
}
}
$f1 = new Foo( 42 );
$f2 = $f1;
$f3 = new Foo( 42 );
$f4 = new Foo( '42' );
$f5 = new Foo( 'Bar' );
$a = [ $f1, $f2, $f3, $f4, $f5 ];
与我统一后,array_unqiue
我希望得到一个包含 4 个元素的数组[ $f1, $f3, $f4, $f5 ]
。但它指出,这array_unqiue
是松散类型的工作,我得到[ $f1, $f5 ]
的不是我需要的结果。
就我而言,我写了一个像集合一样工作的集合。我可以传递一些初始元素。这些元素应该得到验证。如果一个元素是重复的,则必须抛出异常。按照松散类型的顺序,array_unqiue
我想出了这个解决方案(它可以很容易地适应统一数组)。
$boundN = count( $elements );
$boundM = $boundN - 1;
for ( $m = 0; $m < $boundM; $m++ )
{
for ( $n = $m + 1; $n < $boundN; $n++ )
{
if ( $elements[ $m ] === $elements[ $n ] )
{
throw new DuplicateElementException( 'The initial values contain duplicates.' );
}
}
}
至少我缩小了内部循环中的迭代。可以假设,外循环中所有通过的元素都经过验证,无需再次验证。
我的问题是:是否有更短的算法等于类似算法之类的算法Quick Search
?