将字符串拆分为数组并附加上一个值

tre*_*ake 13 php arrays explode

我有这个字符串:

无功/日志/ file.log

我最终希望得到一个如下所示的数组:

Array => [
    '1' => 'var',
    '2' => 'var/log',
    '3' => 'var/log/file.log'
]
Run Code Online (Sandbox Code Playgroud)

我目前有这个:

<?php
    $string = 'var/log/file.log';
    $array = explode('/', $string);
    $output = [
        1 => $array[0],
        2 => $array[0]. '/' .$array[1],
        3 => $array[0]. '/' .$array[1]. '/' .$array[2]
    ];

    echo '<pre>'. print_r($output, 1) .'</pre>';
Run Code Online (Sandbox Code Playgroud)

这感觉非常违反直觉,我不确定PHP中是否已经内置了可以解决这个问题的东西.

如何使用追加前一个值来构建数组?

pr1*_*nc3 11

<?php
$string = 'var/log/some/other/directory/file.log';
$array = explode('/', $string);

$i = 0;
foreach ($array as $data) {
    $output[] = isset($output) ? $output[$i - 1] . '/' . $data : $data;
    $i++;
}


echo '<pre>';

print_r($output);
Run Code Online (Sandbox Code Playgroud)

上面有一个更简单的解决方案.您可以简单地将新阵列字段设置为新阵列中的前一个阵列与您阵列中当前阵列的串联foreach.

输出是:

Array
(
    [0] => var
    [1] => var/log
    [2] => var/log/some
    [3] => var/log/some/other
    [4] => var/log/some/other/directory
    [5] => var/log/some/other/directory/file.log
)
Run Code Online (Sandbox Code Playgroud)


Tim*_*sen 5

此解决方案采用从输入路径开始的方法,然后逐个删除路径,在每个步骤将剩余输入添加到数组.然后,我们将数组反转为生成所需输出的最后一步.

$input = "var/log/file.log";
$array = [];
while (preg_match("/\//i", $input)) {
    array_push($array, $input);
    $input = preg_replace("/\/[^\/]+$/", "", $input);
    echo $input;
}
array_push($array, $input);
$array = array_reverse($array);
print_r($array);

Array
(
    [0] => var
    [1] => var/log
    [2] => var/log/file.log
)
Run Code Online (Sandbox Code Playgroud)

上面的调用preg_replace剥离了输入字符串的最终路径,包括正斜杠.重复此过程,直到只剩下一个最终路径组件.然后,我们将最后一个组件添加到同一个数组中.