Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如果值存在,则使用另一个数组对数组进行排序_Php_Arrays - Fatal编程技术网

Php 如果值存在,则使用另一个数组对数组进行排序

Php 如果值存在,则使用另一个数组对数组进行排序,php,arrays,Php,Arrays,我的问题有点类似于: 我有一个文件路径和目录的嵌套关联数组,下面是一个示例: Array ( [Introduction] => /documentation/Introduction.md [Preface] => Array ( [Installation] => /documentation/Preface/Installation.md [Requirements] => /docum

我的问题有点类似于:

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

Array
(
    [Introduction] => /documentation/Introduction.md
    [Preface] => Array
        (
            [Installation] => /documentation/Preface/Installation.md
            [Requirements] => /documentation/Preface/Requirements.md
        )
)
如果任何值是数组,则表示子目录,如果是字符串,则表示文件路径。这用于输出文档文章的导航列表。文档项目存储在标记文件中

问题:

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


因此,例如,如果有人在
/documentation/preforce/Release Notes.md
添加文档文章,如果未在order数组中指定,则会将其添加到Preforce子数组的底部。如果它是在顺序数组中指定的,那么它应该出现在任何需要的地方。

因此,基本上您有一个预定义的嵌套文件数组,但您也希望包含任何存在但不在预定义的顺序数组中但存在于此其他数组中的文件

如果您的有序数组与第一个数组的格式相同,那么类似的方法应该可以工作

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格式,但实际上并不存在;但这应该相对容易检查。

谢谢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;
}

你能给我举一个订单数组的例子吗?恐怕不行,因为我不知道如何构造它。所以现在你有两个问题:)想提个建议吗?我完全被难住了。我只是希望能够将函数传递给上面的数组,然后传递包含预定顺序的内容,然后尽可能地重新排序数组。