Любой эквивалент. = Для добавления в начало строки в PHP?

104

Просто интересно, есть ли что-то вроде. = Для добавления текста в начало строки, например:

$foo =. 'bar';

что не работает.

Изменить: изначально был пример, $foo =. $bar;который может быть достигнут с помощью$bar .= $foo;

Yuttadhammo
источник
Я ручаюсь за Джеймса, хотя он должен был написать на него ответ ...
Кристиан
6
Это добавляется $fooк $bar, а не добавляется $barк $foo. Результат похож, но я думаю, он хочет мутировать $foo.
Эрик V
Это должно было быть немного насмешливым комментарием (поэтому это комментарий, а не ответ)!
Джеймс Аллардис
1
тьфу ... извините, плохой пример ... исправлен сейчас :)
yuttadhammo

Ответы:

164

Нет. Но ты можешь сделать

$foo = "bar" . $foo
Эрик V
источник
4

Вы всегда можете создать для этого свою функцию:

function prepend($string, $chunk) {
     if(!empty($chunk) && isset($chunk)) {
        return $string.$chunk;
     }
     else {
        return $string;
     }
}

$stringбудет фрагментом, который вы хотите добавить $chunkв начало, и текстом, к которому вы хотите добавить что-то.

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

Аарон
источник
1
Спасибо, но вы правы. Это определенно не так просто и быстро, как что-то встроенное. Не стесняйтесь копировать и вставлять, если это помогает облегчить задачу: D
Аарон
7
Если что-то есть, !emptyэто тоже всегда isset, нет необходимости в этой двойной проверке. Кроме того, поскольку $chunkэто обязательный параметр функции, его необходимо передать функции, иначе PHP пожалуется. Это означает, что эту проверку можно сократить до if ($chunk)(чтобы увидеть, является ли она ложной или «пустой»). Но, если $chunkничего не будет содержать, все равно ничего не произойдет. Таким образом, все тело функции может быть сокращено до return $string . $chunk. Это означает, что вся эта функция совершенно не нужна.
deceze
1
Вы можете установить переменную, но при этом быть пустой. Например, переменная со значением "" пуста, но также установлена.
Аарон
1
Да, но я говорю, что ваша функция - очень многословный способ написания $foo . $bar. Я призываю вас найти любой важный случай, если бы ваша функция выполнялась иначе. :)
deceze
3

Я знаю, что это было задано / отвечено некоторое время назад, но я предоставил этот ответ, поскольку он функционально эквивалентен, несмотря на то, что он не является оператором присваивания, и никто не прокомментировал его использование для общей конкатенации строк.

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

$foo = 'foo';

$append = sprintf('%1$s%2$s', $foo, 'bar');
var_dump($append);
/* string(6) "foobar" */

$prepend = sprintf('%1$s%2$s', 'bar', $foo);
var_dump($prepend);
/* string(6) "barfoo" */

$prependInvert = sprintf('%2$s%1$s', $foo, 'bar');
var_dump($prependInvert);
/* string(6) "barfoo" */

$wrap = sprintf('%2$s%1$s%2$s', $foo, 'bar');
var_dump($wrap);
/* string(6) "barfoobar" */

Я обычно использую vsprintf, так как работать с массивами легче управлять позициями значений, чем с отдельными аргументами.

$vprepend = vsprintf('%2$s%1$s', array('foo', 'bar'));
var_dump($vprepend);
/* string(6) "barfoo" */

Также с массивом значений можно просто получить implodeрезультирующий набор значений для простой конкатенации строк.

 var_dump(implode('', array('bar', 'foo')));
 /* string(6) "barfoo" */
Fyrye
источник
К сожалению, я не думаю, что sprintf () так же быстр, как простые конкатенации. И это, конечно, не кажется таким дружественным к синтаксису. См .: stackoverflow.com/q/7147305/2430549
HoldOffHunger 09
Правильно, но не понимаю, что вы имеете в виду под синтаксисом. Хотя это не так быстро или упрощенно, как конкатенация. sprintfобычно используется на нескольких языках. sprintfимеет свое место и цель, когда его использовать. например. приведение нескольких значений или принудительное использование нескольких входов sprintfпредоставляет вам больше функциональных возможностей, чем простая конкатенация, когда это необходимо . См .: 3v4l.org/8PWil. Но его не следует использовать как полную замену конкатенации.
fyrye 09
3

Вы можете обернуть встроенную функцию substr_replace, где аргументы $ start и $ length могут быть установлены на 0, что добавляет $ замену к $ string и возвращает результат, например:

function prepend(& $string, $prefix) {
    $string = substr_replace($string, $prefix, 0, 0);
}

Пример использования вспомогательной функции:

$email_message = "Jonathan";
$appropriate_greeting = "Dear ";
prepend($email_message, $appropriate_greeting);
echo $email_message;

Разумеется, если вы занимаетесь процедурным программированием.

sde-simon
источник
Я не вижу интереса в использовании substr_replace; простое $string = $prefix.$string;выполнение функции сделает свое дело.
Пьер-Оливье Варес,
2

Превратив комментарий Блейкетепаттона в ответ (спасибо), способ сделать это более аккуратно для более длинных имен переменных - это использовать ссылку на переменную следующим образом:

$f = &$foo; $f = "bar{$f}";

Это избавит вас от необходимости набирать ответ Эрика V, если исходное имя переменной составляет 12 символов или больше.

Альтернатива в одной строке:

$f = 'bar' . ($f = &$foo);
RobRecord
источник