2011-06-09 10 views
9

¿cuál es la mejor manera de hacer lo siguiente:Cómo dividir un trazado correctamente en PHP

me sale un camino con una petición AJAX

por ejemplo, dir1/dir2/dir3/dir4

tengo que presentarlo como esto en mi página web:

dir1 >> dir2 >> dir3 >> dir4 

cada uno de ellos siendo etiquetas HTML de anclaje con el atributo href siendo

/dir1 

/dir1/dir2 

/dir1/dir2/dir3 

/dir1/dir2/dir3/dir4 

respectivamente

¿Cuál es el forma más elegante y eficiente para lograr esto?

hasta ahora, que estoy haciendo algo como esto que creo que es muy sucio:

<?php 
$dirs = explode(PATH_SEPARATOR, $this->metadata["path"]); 
    foreach ($dirs as $key=>$val) { 
      if ($val == '') { 
       continue; 
      } 
      $pathArray = array(); 
      for ($i = 0; $i <= $key; $i++) { 
       array_push($pathArray, $dirs[$i]); 
      } 
      $path = implode('/', $pathArray); 
      echo " >> <a href=" . $path . ">" . truncate($val) . "</a>"; 
    } 
    ?> 

Gracias de antemano

+0

Me parece correcto (y no tan sucio), aunque la función 'truncado' no existe. ¿Es una función personalizada o quiso decir 'recortar'? –

+0

es una función personalizada ... ¿así que creo que es un elegante bloque de código? :) – nezgerland

+0

Bueno, así es como lo haría. Si eso es elegante, entonces hoorray: D –

Respuesta

11

Algo como esto quizá (si recibo su intención correcta):

<?php 
$str = 'dir1/dir2/dir3/dir4'; 

$output = array(); 
$chunks = explode('/', $str); 
foreach ($chunks as $i => $chunk) { 
    $output[] = sprintf(
     '<a href="#/%s">%s</a>', 
     implode('/', array_slice($chunks, 0, $i + 1)), 
     $chunk 
    ); 
} 

echo implode(' &gt;&gt; ', $output); 

salida:

<a href="#/dir1">dir1</a> &gt;&gt; 
<a href="#/dir1/dir2">dir2</a> &gt;&gt; 
<a href="#/dir1/dir2/dir3">dir3</a> &gt;&gt; 
<a href="#/dir1/dir2/dir3/dir4">dir4</a> 
+0

Me gusta más tu solución y yo iré con la tuya. Muchas gracias por su tiempo y su respuesta. – nezgerland

+0

¿Qué ocurre con los sistemas de archivos diferentes con barras diagonales diferentes? – Sevenearths

+0

@Sevenearths No veo la relación con sistemas de archivos específicos. Pero si es necesario, solo use un carácter diferente a ''/'' en el código. – Yoshi

1

lo haría así ...

<?php 

$path = 'dir1/dir2/dir3/dir4'; 
$dirs = explode('/', $path); 

while (count($dirs) > 0) { 
    $link = '/' . implode($dirs, '/'); 
    $text = array_pop($dirs); 
    $breadcrumb = "<a href=\"$link\">$text</a>" . $breadcrumb; 
    if (count($dirs) > 0) { 
     $breadcrumb = ' &gt;&gt; ' . $breadcrumb; 
    } 
} 

echo $breadcrumb; 

Si usted está recibiendo este camino basado en la URL que no es necesario utilizar PATH_SEPARATOR porque URLs siempre deben usar /. Si se deriva de la ruta de sistema de archivos que se necesita para intercambiarlo en lugar de '/' en la línea 4.

+0

Gracias por el PATH_SEPARATOR .. estoy haciendo explotar ('/', $ path) ahora :) – nezgerland

+2

@ user787124: tenga en cuenta que 'PATH_SEPARATOR' no es/o \ - lo es; o: en Windows y Unix, respectivamente. Es el 'DIRECTORY_SEPARATOR' que puede usar. –

+0

buena respuesta. gracias, amigo – Thamaraiselvam

1

Var 1

<?php 

    $str = '/dir1/dir2/dir3/dir4'; 
    $arr = array_filter(explode('/',$str)); 
    $out = array('/'.implode('/',$arr).'/'); 
    while((array_pop($arr) and !empty($arr))){ 
     $out[] = '/'.implode('/',$arr).'/'; 
    }; 

    print_r($out); 

    /* 
    Array(
     [0] => /dir1/dir2/dir3/dir4/ 
     [1] => /dir1/dir2/dir3/ 
     [2] => /dir1/dir2/ 
     [3] => /dir1/ 
    ) 
    */ 

?> 

Var 2 (enlaces)

<?php 

    $str = '/dir1/dir2/dir3/dir4'; 
    $arr = array_filter(explode('/',$str)); 
    $out = array('<a href="/'.implode('/',$arr).'/">'.basename($str).'</a>'); 
    while((array_pop($arr) and !empty($arr))){ 
     $out[] = '<a href="/'.implode('/',$arr).'/">'.end($arr).'</a>'; 
    }; 

    print_r($out); 

    /* 
    Array 
    (
     [0] => <a href="/dir1/dir2/dir3/dir4/">dir4</a> 
     [1] => <a href="/dir1/dir2/dir3/">dir3</a> 
     [2] => <a href="/dir1/dir2/">dir2</a> 
     [3] => <a href="/dir1/">dir1</a> 
    ) 
    */ 

?>