PHP объединить два пути - относительный абсолют - PullRequest
0 голосов
/ 11 февраля 2020

Кто-нибудь знает, есть ли способ легко слиться с путями?

/www/htdocs/v450687/server/jobs/bodymind/uploads
uploads/videoscontent/1/

в / www/htdocs/v450687/server/jobs/bodymind/uploads/videoscontent/1/

/www/htdocs/v450687/server/jobs/bodymind/uploads/videoscontent
uploads/videoscontent/1/snips

в / www/htdocs/v450687/server/jobs/bodymind/uploads/videoscontent/1/snips

/www/htdocs/v450687/server/jobs/bodymind/uploads/1/1
1/1/snips

до / www/htdocs/v450687/server/jobs/bodymind/uploads/videoscontent/1/1/snips

Ответы [ 3 ]

0 голосов
/ 11 февраля 2020

Насколько я знаю, для этого нет встроенного метода. Вот мой подход:

  1. Разнесение двух путей в массив
  2. Объединение их вместе
  3. Удаление дубликатов.

Вот пример:

$path_1 = '/www/htdocs/v450687/server/jobs/bodymind/uploads';
$path_2 = 'uploads/videoscontent/1/';
echo implode('/', array_unique(array_merge(explode('/', $path_1), explode('/', $path_2)), SORT_REGULAR));

Вывод: /www/htdocs/v450687/server/jobs/bodymind/uploads/videoscontent/1

0 голосов
/ 11 февраля 2020

Вы должны взрывать пути в массивы, объединять их и удалять дубликаты. Вы можете сделать это по-разному, вот несколько примеров:

$path1 = '/www/htdocs/v450687/server/jobs/bodymind/uploads';
$path2 = 'uploads/videoscontent/1/';

print_r(pathToArray($path1, $path2));

function pathToArray($path1, $path2){
    foreach(explode('/', $path1) as $part){
        $output1[] = $part;
    }

    foreach(explode('/', $path2) as $part){
        $output2[] = $part;
    }

    $output = array_merge($output1, $output2);

    $output = array_unique($output);
    $output = implode("/",$output);
    return $output;
}

Или

$path1 = '/www/htdocs/v450687/server/jobs/bodymind/uploads';
$path2 = 'uploads/videoscontent/1/';

echo implode('/', array_unique(array_merge(explode('/', $path_1), explode('/', $path_2)), SORT_REGULAR));

ОБНОВЛЕНИЕ : Как я вижу, вы обновили свой вопрос, поэтому Я разрабатываю свой ответ. В этом случае, чтобы это исправить, все, что вам нужно сделать, это использовать array_unique () для каждого массива.

$path1 = '/www/htdocs/v450687/server/jobs/bodymind/uploads/1/1';
$path2 = '1/1/snips';

print_r(pathToArray($path1, $path2));

function pathToArray($path1, $path2){
    foreach(explode('/', $path1) as $part){
        $output1[] = $part;
    }

    foreach(explode('/', $path2) as $part){
        $output2[] = $part;
    }

    $output1 = array_unique($output1);
    $output2 = array_unique($output2);
    $output = array_merge($output1, $output2);

    //$output = array_unique($output);
    $output = implode("/",$output);
    return $output;
}
0 голосов
/ 11 февраля 2020

Решение: встроенная функция для объединения перекрывающихся последовательностей строк в php?

echo replaceOverlap("abxcdex", "xcdexfg"); //Result: abxcdexfg

function findOverlap($str1, $str2){
  $return = array();
  $sl1 = strlen($str1);
  $sl2 = strlen($str2);
  $max = $sl1>$sl2?$sl2:$sl1;
  $i=1;
  while($i<=$max){
    $s1 = substr($str1, -$i);
    $s2 = substr($str2, 0, $i);
    if($s1 == $s2){
      $return[] = $s1;
    }
    $i++;
  }
  if(!empty($return)){
    return $return;
  }
  return false;
}

function replaceOverlap($str1, $str2, $length = "long"){
  if($overlap = findOverlap($str1, $str2)){
    switch($length){
      case "short":
        $overlap = $overlap[0];
        break;
      case "long":
      default:
        $overlap = $overlap[count($overlap)-1];
        break;
    }     
    $str1 = substr($str1, 0, -strlen($overlap));
    $str2 = substr($str2, strlen($overlap));
    return $str1.$overlap.$str2;
  }
  return false;
}
...