Поднявшись на две или три папки, используя dirname дважды или трижды

Посмотрите на код

$link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
echo dirname(dirname($link));

Вопрос 1. Элегантно ли использовать dirname дважды, чтобы подняться на два уровня вверх?

Вопрос 2. Если вы хотите подняться на три уровня, будет ли хорошей практикой использовать dirname три раза?

2 ответа

Решение

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

Вот пример кода, который может делать то, что вы хотите. Вместо того, чтобы использовать dirname несколько раз или вызывая for цикл, он использует preg_split, array_slice и implode, предполагая, что / ваш разделитель каталогов.

$string = 'http://example.com/some_folder/another_folder/yet_another/folder/file
.txt';

for ($i = 0; $i < 5; $i++) {
  print "$i levels up: " . get_dir_path($string, $i) . "\n";
}

function get_dir_path($path_to_file, $levels_up=0) {
  // Remove the http(s) protocol header
  $path_to_file = preg_replace('/https?:\/\//', '', $path_to_file);

  // Remove the file basename since we only care about path info.
  $directory_path = dirname($path_to_file);

  $directories = preg_split('/\//', $directory_path);
  $levels_to_include = sizeof($directories) - $levels_up;
  $directories_to_return = array_slice($directories, 0, $levels_to_include);
  return implode($directories_to_return, '/');
}

Результат:

0 levels up: example.com/some_folder/another_folder/yet_another/folder
1 levels up: example.com/some_folder/another_folder/yet_another
2 levels up: example.com/some_folder/another_folder
3 levels up: example.com/some_folder
4 levels up: example.com

Вопрос 1. Элегантно ли использовать dirname дважды, чтобы подняться на два уровня вверх?

Я не думаю, что это элегантно, но в то же время это, вероятно, хорошо для 2 уровней

Вопрос 2. Если вы хотите подняться на три уровня, будет ли хорошей практикой использовать dirname три раза?

Чем больше у вас уровней, тем менее читабельным он становится. Для большого количества уровней я бы использовал foreach, и если он используется достаточно часто, я бы поместил его в функцию

function multiple_dirname($path, $number_of_levels) {

    foreach(range(1, $number_of_levels) as $i) {
        $path = dirname($path);
    }

    return $path;
}
Другие вопросы по тегам