2012-04-08 6 views
4

У меня есть uri и вы хотите получить массив деталей, начиная с полного uri, пока у меня не будет только первый сегмент uri. У меня также есть домен, но сегменты сшиты, начиная с конца.PHP transform array 'a', 'b', 'c' to 'a/b/c', 'a/b', 'a'

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'); 

ответ

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'].

+0

Nice, но метод домена в обратном порядке, не test.domain но domain.com – Mike

+0

просто используйте array_reverse, затем – dynamic

+0

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; 
} 
Смежные вопросы