Jakikolwiek odpowiednik. = Do dodawania do początku łańcucha w PHP?

104

Zastanawiam się tylko, czy istnieje coś takiego jak. = Do dodawania tekstu na początku ciągu, np:

$foo =. 'bar';

co nie działa.

Edycja: pierwotnie był przykład, $foo =. $bar;który można osiągnąć za pomocą$bar .= $foo;

yuttadhammo
źródło
Ręczę za Jamesa, chociaż powinien był napisać odpowiedź ...
Christian
6
Który dołącza $foodo $bar, zamiast poprzedzenie $bardo $foo. Wynik jest podobny, ale myślę, że chce mutować $foo.
Eric V
To miał być nieco żartobliwy komentarz (dlatego jest to komentarz, a nie odpowiedź)!
James Allardice
1
ugh ... przepraszam, zły przykład ... naprawiono teraz :)
yuttadhammo

Odpowiedzi:

164

Nie. Ale możesz to zrobić

$foo = "bar" . $foo
Eric V
źródło
4

Zawsze możesz stworzyć własną funkcję do tego:

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

$stringbyłby fragmentem, który chcesz wstawić na początku, i $chunktekstem, do którego chcesz coś dołączyć.

Można powiedzieć, że kontrole są opcjonalne, ale mając je w sobie, nie musisz się martwić o przypadkowe przekazanie wartości zerowej.

Aaron
źródło
1
Dzięki, masz rację. Zdecydowanie nie jest to tak łatwe ani szybkie, jak coś wbudowanego. Możesz kopiować i wklejać, jeśli to ułatwi: D
Aaron,
7
Jeśli coś jest, !emptyto też zawsze isset, nie ma potrzeby tego podwójnego sprawdzania. Ponadto, ponieważ $chunkjest to wymagany parametr funkcji, musi zostać przekazany do funkcji, w przeciwnym razie PHP będzie narzekać. Oznacza to, że to sprawdzenie można skrócić do if ($chunk)(aby sprawdzić, czy jest fałszywe, czyli „puste”). Ale jeśli $chunknic nie zawiera, i tak nic się nie stanie. Zatem cała ta część funkcji może być skrócona do return $string . $chunk. Co oznacza, że ​​cała ta funkcja jest dość niepotrzebna.
deceze
1
Możesz ustawić zmienną, ale także być pustą. Na przykład zmienna o wartości „” jest pusta, ale również ustawiona.
Aaron,
1
Tak, ale mówię, że twoja funkcja jest bardzo rozwlekłym sposobem pisania $foo . $bar. Wzywam cię do znalezienia każdej ważnej sprawy, w której twoja funkcja robi coś innego. :)
deceze
3

Wiem, że zadawano to pytanie / udzielono odpowiedzi jakiś czas temu, ale udzielam tej odpowiedzi, ponieważ jest ona równoważna funkcjonalnie, mimo że nie jest operatorem przypisania i nikt nie skomentował jej użycia do ogólnej konkatenacji ciągów.

Możesz przyjrzeć się zastosowaniu rodziny funkcji sprintf( dokumentacji ) do konkatenacji ciągów. Zapewnia o wiele więcej oczyszczania i użyteczności niż zwykłe połączenie dwóch ciągów z operatorami przypisania.

$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" */

Zwykle używam vsprintf, ponieważ praca z tablicami jest łatwiejsza do zarządzania pozycjami wartości niż pojedynczymi argumentami.

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

Również w przypadku tablicy wartości można po prostu uzyskać implodewynikowy zestaw wartości dla prostej konkatenacji ciągów.

 var_dump(implode('', array('bar', 'foo')));
 /* string(6) "barfoo" */
fyrye
źródło
Niestety nie sądzę, że sprintf () jest tak szybki jak proste konkatacje. I z pewnością nie wydaje się też tak przyjazny dla składni. Zobacz: stackoverflow.com/q/7147305/2430549
HoldOffHunger
Prawidłowo, choć nie jestem pewien, co rozumiesz przez przyjazną składnię. Chociaż nie jest tak szybka ani uproszczona jak konkatenacja. sprintfjest powszechnie używany w wielu językach. sprintfma swoje miejsce i cel, kiedy go używać. na przykład. rzutowanie wielu wartości lub wymuszanie wielu danych wejściowych przy użyciu sprintfzapewnia większą funkcjonalność niż zwykła konkatenacja, gdy jest to wymagane . Zobacz: 3v4l.org/8PWil Ale nie powinno być używane jako kompletny zamiennik konkatenacji.
fyrye
3

Możesz zawinąć wbudowaną funkcję substr_replace, w której argumenty $ start i $ length można ustawić na 0, co poprzedza zamianę $ na ciąg znaków $ i zwraca wynik, na przykład:

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

Przykładowym zastosowaniem funkcji pomocniczej byłoby:

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

To znaczy, jeśli interesujesz się programowaniem proceduralnym.

sde-simon
źródło
Nie widzę zainteresowania używaniem substr_replace; zrobienie prostego $string = $prefix.$string;w funkcji załatwi sprawę.
Pierre-Olivier Vares
2

Przechodząc komentarz Blakethepatton jest na odpowiedź (dziękuję), sposób to zrobić bardziej starannie dłużej nazw zmiennych jest za pomocą odwołania do zmiennej w następujący sposób:

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

Pozwoli to zaoszczędzić Ci wpisywania odpowiedzi Erica V, jeśli oryginalna nazwa zmiennej ma 12 znaków lub więcej.

Alternatywa w jednej linii:

$f = 'bar' . ($f = &$foo);
robrecord
źródło