#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