将PHP数组 'a', 'b', 'c' 转换为 'a/b/c', 'a/b', 'a'。

4

我有一个 URI,想要获取从完整 URI 开始的一系列部分的数组,直到我只剩下第一个 URI 段作为部分。我还有域名,但是段从末尾开始拼接。

String 'a/b/c' to array('a/b/c', 'a/b', 'a')
String 'test.domain.com' to array('test.domain.com', 'domain.com', 'com')

根据我的初始方法和答案中的第二种方法,以及我想知道哪一种是最快的,或许还有第四种更好的方法...

方法1:

function explode_special($delimiter, $string, $reverse = false)
{
    if (strpos($string, $delimiter) === false) return array($string);

    $segments = explode($delimiter, $string);

    if ( ! $reverse)
    {
        array_walk($segments, function($v, $k, $d) use(&$segments, &$delimiter) {
            $d[$k] = implode($delimiter, array_slice($segments, 0, (count($segments) - $k)));
        }, &$parts);
    }
    else
    {
        array_walk($segments, function($v, $k, $d) use(&$segments, &$delimiter) {
            $d[$k] = implode($delimiter, array_slice($segments, $k));
        }, &$parts);
    }

    return $parts;
}

方法二:
function explode_special($delimiter, $string, $reverse = false)
{
    if (strpos($string, $delimiter) === false) return array($string);

    $segments = explode($delimiter, $string);

    $parts = array();

    while ($segments)
    {
        $parts[] = implode($delimiter, $segments);

        if ($reverse)
        {
            array_shift($segments);
        }
        else
        {
            array_pop($segments);
        }
    }

    return $parts;
}

第三种方法:

function explode_special($delimiter, $string, $reverse = false)
{
    if (strpos($string, $delimiter) === false) return array($string);

    $parts = array($string);

    for ($i = substr_count($string, $delimiter); $i > 0; $i--)
    {
        $parts[] = $string = $reverse
        //  ? trim(strstr($string, $delimiter), $delimiter)
            ? substr($string, strpos($string, $delimiter) + 1)
            : substr($string, 0, strrpos($string, $delimiter));
    }

    return $parts;
}

输出:

// explode_special('/', 'a/b/c') = array('a/b/c', 'a/b', 'c');
// explode_special('.', 'test.domain.com', true) = 
//     array('test.domain.com', 'domain.com', 'com');
3个回答

1
function multisplit($delim,$str) {
    $parts = explode($delim,$str);
    $arr = Array();
    while($parts) {
        $arr[] = implode($delim,$parts);
        array_pop($parts);
    }
    return $arr;
}

通过该函数,您只需调用multisplit("/","a/b/c");,它将返回['a/b/c','a/b','a']。同样,调用multisplit(".","test.domain.com");并获得['test.domain.com','test.domain','test']

不错,但是域名方法的顺序是相反的,不是test.domain而是domain.com。 - Mike
yes123,你看过我的问题了吗?array_reverse无法工作。 - Mike

0

我想出了以下内容

<?php

header("Content-type: text/plain"); //For display purposes only

/**
 * Returns an array of strings with diminishing elements of $string according to $delimiter
 *
 * @param string $string        The string
 * @param string $delimiter     The delimiter
 *
 * @return string[]             Array of strings
 */
function degrading_split($string, $delimiter) {
    $exploded = explode($delimiter, $string);   //Array version of the string
    $result   = array();                        //Initialize result array

    foreach ($exploded as $key => $value) {     //Iterate the array

        $result[] = implode(                    #Implode...
            $delimiter,                         #Using the original delimiter
            array_slice($exploded, $key)        #The complete $exploded array starting from the current $key
        );
    }

    return $result;

}

print_r(degrading_split("a/b/c/d", "/"));

0

你对使用正则表达式的想法是什么?

function splitString($string,$delim) {
    $arr = array();
    preg_match_all('~['.$delim.']~U',$string,$delimCounter);
    $arr[] = $string;
    for ($i = 0;$i<count($delimCounter[0]);$i++) {
        $string = $arr[] = preg_replace('~^[^.]*['.$delim.']~',"",$string);
    }
    return $arr;
}

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