Как рекурсивно вычитать из массива?


Я вытаскиваю параметр url и пытаюсь создать из него хлебную крошку. Итак, если я потяну:

$url = 'contact/jane/now';

И я делаю:

$path = explode("/",$url);

Как я могу поместить его в цикл, чтобы он разбивал каждую часть на путь, подобный этому:

<a href="/contact">contact</a>
<a href="/contact/jane">jane</a>
<a href="/contact/jane/now">now</a>
Author: Justin Johnson, 2010-02-01

4 answers

$answer = '';
foreach ($path as $path_part){
 $answer .= '/'.$path_part;
 print('<a href="'.$answer.'">'.$path_part.'</a>');
}
 4
Author: Mike Sherov, 2010-02-01 03:17:34

До PHP 5.3:

array_reduce($path, create_function('$a, $b', '
    echo "<a href=\"$a/$b\">$b</a>\n";

    return "$a/$b";
'));

В PHP 5.3:

array_reduce($path, function($a, $b) {
    echo "<a href=\"$a/$b\">$b</a>\n";

    return "$a/$b";
});
 2
Author: LiraNuna, 2010-02-01 03:33:59

Вы можете использовать Для, Для каждого, Делать, Делать, Пока, Пока. Действительно все, что ты захочешь. http://php.net/manual/en/control-structures.for.php Когда ваш взрывается, он превращает его в массив строк http://us.php.net/manual/en/function.explode.php

Итак, просто используйте метод count() и определите, сколько элементов находится в массиве http://us.php.net/manual/en/function.count.php

А затем продолжайте, просматривайте и читайте по одному за раз. Если вы хотите начните с последнего, а затем вернитесь назад, вы просто измените свой цикл, чтобы инициализировать его по количеству массива, а затем каждый раз вычитайте один из своего счетчика. В противном случае просто делайте это как обычно.

Ура за просмотр документа PHP!

 0
Author: David, 2010-02-01 03:12:57

Вы могли бы использовать array_slice для этого , код на самом деле не протестирован, но я надеюсь, что вы поняли идею

...
$url   = explode('/', $url);
$links = array();

for ($i = 0; $i < count($url); $i++) {
    $crumb    = ($i > 0) ? implode('/', array_slice($url, 0, $i)) .'/' : $url[$i] .'/';
    $links[]  = sprintf('<a href="%s">%s</a>', $crumb . $url[$i], $url[$i]);
}
 0
Author: tDo, 2010-02-01 03:16:14