如果值存在php,则使用另一个数组排序数组

时间:2014-03-11 06:54:41

标签: php arrays

我的问题与Sort an Array by keys based on another Array?

略有相似

我有一个嵌套的文件路径和目录关联数组,这是一个例子:

Array
(
    [Introduction] => /documentation/Introduction.md
    [Preface] => Array
        (
            [Installation] => /documentation/Preface/Installation.md
            [Requirements] => /documentation/Preface/Requirements.md
        )
)

如果任何值是一个数组,则表示一个子目录,如果它是一个字符串,则它是一个文件路径。这用于输出文档文章的章程导航列表。文档文章存储在markdown文件中。

问题:

该数组目前按字母顺序排列。我想在包含预期顺序的应用程序中存储另一个文件路径和目录数组,我想要一个函数尝试重新排序上面的filepaths数组,以匹配应用程序中存储的数组的顺序。如果有人将任何新的文档文章添加到文件系统中,但没有将其添加到订单数组中,那么该文章需要放在该目录的数组底部。

例如,如果有人要在/documentation/Preface/Release Notes.md添加文档文章,那么如果没有在前面的子数组中指定它,它将被添加到Preface子数组的底部。订单数组。如果在订单数组中指定了它,那么它应该出现在任何地方。

2 个答案:

答案 0 :(得分:0)

所以基本上你有一个预定义的嵌套文件数组,但你想要包含任何存在但不在预定义有序数组中但存在于另一个数组中的文件。

如果您的有序数组与第一个数组的格式相同,那么这样的事情就可以了。

function populateIfMissing( $arr1, $arr2 )
{
    foreach ( $arr1 as $key => $ele )
    {
        if ( is_array( $ele ) && in_array( $key, $arr1 ) )
        {
            // Directory exists
            populateIfMissing( $arr1[$key], $ ele );
        }
        elseif ( !in_array( $key, $arr1 ) )
        {
            //Not in array add it
            $arr1[$key] = $ele;
        }
    }
    return $arr1;
}

这是$ arr1是实际目录的地方,$ arr2是有序结构。

这样做的一个问题是文件可以在$ arr2中但实际上不存在;但这应该相对容易检查。

答案 1 :(得分:0)

感谢Conor。终于有时间来完成这个并且它现在完美地工作。我使用了你的代码,但不得不做出一些改变:

function orderPaths($paths, $intended_order) {
    foreach ( $paths as $key => $ele )
    {
        if ( is_array( $ele ) && in_array( $key, $intended_order ) )
        {
            // Directory exists
        orderPaths( $paths[$key], $intended_order );
        }
        elseif ( !in_array( $paths[$key], $intended_order ) )
        {
            //Not in array add it
            $intended_order[$key] = $ele;
        }
    }
    return $intended_order;
}