【问题标题】:array_unique() without sortingarray_unique() 没有排序
【发布时间】:2011-03-18 09:24:47
【问题描述】:

我正在构建一个扩展 include_path 的自动加载器。它需要一个数组,附加explode()d 包含路径,删除对当前目录的所有引用,在数组的开头添加一个当前目录,最后将整个东西join() 重新组合在一起以形成一个新的包含路径.代码如下

<?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 按照它们在包含路径中定义的顺序查找目录。我想首先查看当前目录,然后是我的搜索目录列表,最后是原始包含路径,这样,例如,默认 include_path 中的公共库的旧版本不会被包含在新版本中在我的搜索列表中。

由于这些原因,我不能使用 array_unique() 因为它对数组的内容进行排序。

有没有办法让 array_unique 保留我的数组中元素的顺序?

【问题讨论】:

  • 绕过您的询问:$array = array_flip(array_flip($array)) 适合您吗? (array_flip 与键交换值,并且由于键始终是唯一的,因此双精度 array_flip 使数组中的值唯一。)

标签: php arrays unique


【解决方案1】:

不直接使用array_unique();但 array_unique 确实保留了键,因此您可以在之后执行 ksort() 以重新创建原始条目顺序

【讨论】:

    【解决方案2】:

    您也可以使用 array_count_value。您将在函数结果的关键处获得唯一的数组结果

    它不会破坏您的数组排序内容。

    参考:http://php.net/manual/en/function.array-count-values.php

    【讨论】:

    • 哦,创意方法!好奇者的快速参考:$unique = array_keys(array_count_values($source));
    【解决方案3】:

    类似:

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

    【讨论】:

    • 提醒:该循环有一个功能[有效;如果您不关心 1] 的值。 array_flip()。 :)
    • 哦该死的我落入了 PHP 规则 #0:总有一个你从未听说过的 PHP 函数 :)
    • 呸哈哈。 :D * 为潜伏在等待伏击的PHP函数唱一首歌,祈求平安通过! *
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 2021-12-15
    • 2014-09-11
    相关资源
    最近更新 更多