Получить разницу между двумя строками без использования массивов

#php

#php

Вопрос:

У меня есть две строки $ A и $ B, отсортированные по целым числам. Реализованная функция должна выводить {A — B} и {B — A}, а код должен быть БЕЗ МАССИВОВ. Есть идеи?

Ввод:

 $A = "1 2 3 8 9"; 
$B = "2 5 9 10 12 14";
  

Вывод:

 {A - B} = "1 3 8"; 
{B - A} = "5 10 12 14";
  

Комментарии:

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

2. Вы можете использовать explode . array_diff(explode(» «, $A), eplode(» «, $ B));

3. @TrueTiem: OP не хочет использовать массив

4. @devpro на самом деле это не массив, а строка. Только преобразование в массив при использовании array_diff

5. код должен быть БЕЗ МАССИВОВ @TrueTiem

Ответ №1:

 $A = "1 2 3 8 9"; 
$B = "2 5 9 10 12 14";

//Build regular expression pattern from $A
$pattern = "/b".str_replace(" ", "b|b", $A)."b/";

//Remove matched numbers within word boundaries
$result = preg_replace($pattern, "", $B);

//Remove any unwanted whitespace
$result = trim(preg_replace("!s !", " ", $result));

echo "{B - A} = " . $result;
  

Комментарии:

1. @eoitos Я рад, что смог помочь! Пожалуйста, не забудьте принять мой ответ, нажав на галочку слева от него, если это решило вашу проблему.

Ответ №2:

Вы можете использовать substring в цикле (и использовать код ASCII) для каждого символа, чтобы определить, равны они или нет, и записать их в другую строку, если они не совпадают. Если ваша цифра больше 1 символа, вам нужно создать подстроку, ищущую следующий пробел.

Комментарии:

1. Я подумал, что мог бы использовать функцию explode

2. @eoitos возвращаемое значение explode какого типа …?

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

4. Точно! Без массива… Нелегко, я трачу 3 дня, и у меня нет решения

Ответ №3:

Вот циклическая версия, использующая strspn и substr для извлечения чисел из строк и substr_replace удаления их при необходимости:

 $a = "1 2 3 8 9"; 
$b = "2 5 9 10 12 14";

$a_offset = 0;
$b_offset = 0;
while ($a_offset < strlen($a) amp;amp; $b_offset < strlen($b)) {
    $a_length = strspn($a, '0123456789', $a_offset);
    $a_num = substr($a, $a_offset, $a_length);
    $b_length = strspn($b, '0123456789', $b_offset);
    $b_num = substr($b, $b_offset, $b_length);
    if ($a_num < $b_num) {
        // keep the a value
        $a_offset = $a_offset   $a_length   1;
    }
    elseif ($b_num < $a_num) {
        // keep the b value
        $b_offset = $b_offset   $b_length   1;
    }
    else {
        // values the same, remove them both
        $a = substr_replace($a, '', $a_offset, $a_length   1);
        $b = substr_replace($b, '', $b_offset, $b_length   1);
    }
}
echo "a - b = $anb - a = $b";
  

Вывод:

 a - b = 1 3 8 
b - a = 5 10 12 14
  

Демонстрация на 3v4l.org