不排序的array_unique()

9

我正在构建一个扩展 include_path 的自动加载器。它接受一个数组,将 explode() 函数的结果追加到 include path 中,移除所有对当前目录的引用,将单个当前目录添加到数组开头,最后使用 join() 函数将整个数组拼接起来形成新的 include path。以下是代码:

<?php
static public function extendIncludePath (array $paths)
{
    // Build a list of the current and new paths
    $pathList   = array_merge (explode (PATH_SEPARATOR, $paths), explode (PATH_SEPARATOR, get_include_path ()));
    // Remove any references to the current directory from the path list
    while ($key = array_search ('.', $pathList))
    {
        unset ($pathList [$key]);
    }
    // Put a current directory reference to the front of the path
    array_unshift ($pathList, '.');
    // Generate the new path list
    $newPath    = implode (PATH_SEPARATOR, $pathList);
    if ($oldPath = set_include_path ($newPath))
    {
        self::$oldPaths []  = $oldPath;
    }
    return ($oldPath);
}
?>

我想在将数组合并之前使用array_unique(),这样如果有人粗心地多次指定相同的路径,PHP就不会多次查找同一位置。但是,我还需要保持数组的排序顺序,因为include按照包含路径的定义顺序查找目录。我希望首先查找当前目录,然后是搜索目录列表,最后才是原始的包含路径,以便例如在我的搜索列表中优先选择较新版本的公共库,而不是默认包含路径中的旧版本。
由于这些原因,我不能使用array_unique(),因为它会对数组内容进行排序。
是否有办法让array_unique()保留数组元素的顺序?

1
绕开你的询问,是否 $array = array_flip(array_flip($array)) 对你来说是一个选项?(array_flip 交换数组中的键和值,由于键始终是唯一的,双重 array_flip 可以使数组中的值唯一。) - pinkgothic
3个回答

8

不要直接使用array_unique(); 但是array_unique()可以保留键值,因此您可以在之后使用ksort()来重新创建条目的原始顺序。


5

2
哦,创意十足的方法!好奇的人可以参考以下代码:$unique = array_keys(array_count_values($source)); - pinkgothic

1

类似这样:

$temp = array();

foreach ( $original_array as $value ) {
    $temp[$value] = 1;
}

$original_array = array_keys($temp);

提醒:有一个函数可以代替那个循环 [如果你不关心值是否为 1]。array_flip()。 :) - pinkgothic
1
哦,该死,我又违反了 PHP 规则 #0:总会有你没听说过的 PHP 函数 :) - Matteo Riva
哈哈哈。:D 唱一首歌给潜伏在等待中伏击毫无戒备的PHP函数,祈求安全通过! - pinkgothic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接