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

时间:2012-04-08 14:43:42

标签: php arrays dns uri

我有一个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;
}

方法2:

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

方法3:

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 个答案:

答案 0 :(得分: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']

答案 1 :(得分: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", "/"));

答案 2 :(得分: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;
}