Поради щодо гольфу в PHP


37

Які загальні поради щодо гольфу в PHP? Я шукаю ідеї, які можна застосувати до проблем із гольфом взагалі, які принаймні дещо специфічні для PHP (наприклад, "видалити коментарі" - це не відповідь). Будь ласка, опублікуйте одну пораду за кожну відповідь.


Зачекайте, чи я це роблю правильно? ... У всякому разі, мені справді цікаво. PHP використовується багатьма людьми та гольфістами, але я майже не маю уявлення, як грати в PHP-код.
JiminP

Використовуйте короткі теги <??> Це може зберегти кілька байт.
Моб

Відповіді:


22

Зрозумійте, як змінні та пробіли взаємодіють з мовними конструкціями PHP.

У свій (правда кажучи, короткий) час гольфу я виявив, що мовні конструкції PHP (наприклад, ехо, повернення, для, в той час як і т. Д.) Поводяться менш інтуїтивно зрозумілим чином при взаємодії зі змінними та пробілами.

echo$v;, наприклад, цілком справедливі, як return$v;і інші подібні конструкції. Ці невеликі скорочення пробілу можуть призвести до значного кумулятивного зменшення довжини.

Майте на увазі, що змінні перед мовними конструкціями потребують пробілу після, як у наступному прикладі:

foreach($a AS$b){}

Оскільки ASце мовна конструкція, перед змінною не потрібно пробілу $b, але якщо пропустити простір перед нею , в результаті чого $aASце буде розбиратися як ім'я змінної і призводить до помилки синтаксису.


3
foreach($a[1]as$b)не потребує пробілу. Йдеться не про мовні конструкції та змінні, а про проміжки між словосимволами різних слів.
Тит

1
Ще один екземпляр, де вам потрібно пробіл, - це з'єднання рядків. Наприклад, echo $a+5." text"не буде працювати, оскільки PHP вважає, що значення .є десятковою крапкою для 5. Щоб він працював, вам потрібно буде додати пробіл таким чином:echo $a+5 ." text"
Business Cat

@BasicSunset Це твердження можна записати як echo$a+5," text";. echoКонструкція дозволяє передати кілька параметрів. де треба було б писати echo"result: ".($a+5)."!";, можна писати echo"result: ",$a+5,"!";. Насправді передача декількох параметрів до антителі echo- це мікрооптимізація, оскільки код запуститься трохи швидше (оскільки ви не об'єднаєте вихід, а надсилаєте його окремо). Для проблем із написанням найшвидшого коду це може допомогти крихітному крихітному шматочку.
Ісмаїл Мігель

@IsmaelMiguel Це працює з echo, але не з print(що вам потрібно, якщо ви помістите це всередину виразу: echoце чиста конструкція, яка не має значення повернення, але print може виконувати функції: вона не потребує дужок, але завжди повертається int(1).
Titus

@Titus я нічого про це не говорив print.
Ісмаїл Мігель

22

Використовуйте рядки з розумом.

Ця відповідь двояка. Перша частина полягає в тому, що при оголошенні рядків ви можете використовувати неявне перетворення PHP невідомих констант у рядки для економії місця, наприклад:

@$s=string;

The @Необхідно перевизначити попередження цього буде виробляти. Загалом, ви закінчуєтесь однозначним скороченням.

полягає в тому, що іноді може бути простором встановити змінну імені часто використовуваної функції. Зазвичай у вас можуть бути:

preg_match(..);preg_match(..);

Але при гольфі це можна легко скоротити до:

@$p=preg_match;$p(..);$p(..);

Маючи лише два екземпляри "preg_match", ви зберігаєте лише один символ, але чим більше ви використовуєте функцію, тим більше місця ви заощадите.


10
@ не потрібен у codegolf; повідомлення та попередження (у тому числі E_DEPRECATED) прийнятні
Тит

3
@Titus Але в PHP попередження виводитимуться на стандартний вихідний файл, тому вони потрібні.
brianush1

1
@Titus Я вважаю, що ви можете придушити їх у php.iniфайлі
Стен Струм

12

Вам не завжди потрібно виписувати умовні чеки. Наприклад, деякі рамки використовують це у верхній частині своїх файлів для блокування доступу:

<?php defined('BASE_PATH')||die('not allowed');

Або в нормальних функціях

$value && run_this();

замість

if($value) { run_this(); }

Він також працює в JS
Евгеній Новиков

8

Використовуйте синтаксис короткого масиву

Оскільки PHP 5.4, масиви можна оголосити за допомогою квадратних дужок (як і JavaScript) замість array()функції:

$arr=['foo','bar','baz'];
// instead of
$arr=array('foo','bar','baz');

Це заощадить п’ять байт.


Але це може коштувати байтів, якщо у вас є "дірки" в асоціативному масиві:

$arr=array(,1,,3,,5);
// is one byte shorter than
$arr=[1=>1,3=>3,5=>5];

недолік виявляється трохи пізніше, якщо ви можете заповнити отвори "порожніми" значеннями:

$arr=[0,1,0,3,0,5,0,7,0,9,10,11];
// costs two byte more than
$arr=array(,1,,3,,5,,7,,9,,11);

2
PHP 7.1 також представив коротке призначення списку: [,$a,$b,$c]=$argv;.
Тит

7

Використовуйте $ {0}, $ {1}, $ {2}, ... замість $ a [0], $ a [1], $ a [2], ...

Якщо ви не здійснюєте маніпуляцію з масивом, більшість посилань на індекс масиву $a[$i]можна замінити просто $$i. Це навіть справедливо, якщо індекс є цілим числом, оскільки цілі числа є дійсними іменами змінних у PHP (хоча літерали потребують дужок, наприклад ${0}).

Розглянемо таку реалізацію кронштейна Вагона Rabonowitz:

3.<?for(;$g?$d=0|($a[$g]=$d*$g--/2+($a[$g]?:2)%$g*1e4)/$g--:238<<printf($e?'%04d':'',$e+$d/$g=1e4)^$e=$d%$g;);

Це можна покращити на 6 байт, просто замінивши обидві посилання масиву $a[$g]на $$g:

3.<?for(;$g?$d=0|($$g=$d*$g--/2+($$g?:2)%$g*1e4)/$g--:238<<printf($e?'%04d':'',$e+$d/$g=1e4)^$e=$d%$g;);

1
Я тільки що врятував 3 байти з цим: showcase .
Тит

6

Дізнайтеся про великий підмножині функцій бібліотеки .

Бібліотека PHP досить величезна і забезпечує безліч зручних функцій, які можуть значно скоротити різні завдання. Ви можете просто шукати кожен раз, коли намагаєтесь щось зробити, але, крім того, щоб витрачати час, ви можете не знайти нічого, що відповідає вашому конкретному пошуку. Найкращий спосіб - просто ознайомитись з бібліотекою та запам'ятати імена функцій та те, що вони роблять.


6
Це багато запам'ятовування, особливо з огляду на досить непослідовну назву цілого ряду функцій ;-)
Joey

@Joey погодився. Захотіть до запам'ятовування бібліотеки Java, за винятком того, що може бути менш корисним, оскільки це більш багатослівне.
Матвій

3
Я вважаю, що найважливішими функціями для завдань, з якими я стикався поки що, є функції маніпулювання струнами та маніпуляції з масивом. Творче використання цих дійсно може скоротити код.
migimaru

6

Виконання функцій всередині рядків.

Спробуйте це:

$a='strlen';
echo "This text has {$a('15')} chars";

Або спробуйте це:

//only php>=5.3
$if=function($c,$t,$f){return$c?$t:$f;};
echo <<<HEREDOCS
    Heredocs can{$if(true,' be','not be')} used too and can{$if(<<<BE
{$if(true,1,0)}
BE
,'','not')} be nested
HEREDOCS;
//Expected output: Heredocs can be used too and can be nested

Це працює лише з використанням рядків ""та heredocs (НЕ плутайте з nowdocs).

Використання вкладених функцій можливе лише всередині вкладених гередок (або ви зіткнетеся з помилками розбору)!


you will run into parse errorsЯ не можу сам це прочитати? Як прискіпливий двигун Zend це поєднує
Стен Струм

Наступного разу, коли я буду в аргументі "PHP - це хороша мова програмування" , я збираюся використовувати це як зустрічну точку. Ого.
прим

@primo Це так погано? : O
Ісмаїл Мігель

5

розвага з набірниками

  • !!$fooперетворить будь-яке значення truthy з true(або 1у виході), фальшивих значень (0, порожній рядок, порожній масив) у false(або порожній вихід)
    Це рідко буде потрібно в коді гольфу, оскільки в більшості випадків, коли вам потрібен булевий, є неявна роль у будь-якому випадку.

  • (int)$fooможна записати як $foo|0або foo^0, але можуть знадобитися дужки.
    Для булевих рядків і рядків, $foo*1або +$fooїх можна використовувати для відтворення до int.

  • На відміну від більшості інших мов, PHP обробляє рядки з числовими значеннями як числа. Отже, якщо у вас є будь-який рядок, який містить число, з яким ви повинні обчислити, просто обчисліть.
  • Інший спосіб не працює: щоб помножити будь-яке число у змінній на 10, ви можете додати нуль: *10-> .0. Але в цьому випадку PHP прийме крапку як десяткову точку і скаржиться. (Це інакше, якщо ви маєте змінну кількість нулів у рядку.)
  • Щоб перетворити масив у рядок, використовуйте joinзамість implode.
    Якщо вам не потрібен роздільник, не використовуйте його: join($a)робить те ж самеjoin('',$a)
  • Збільшення рядків: Найдивовижніша функція imo - це те, що $s=a;$s++;виробляє $s=b;. Це працює з великими та малими літерами. $s=Z;$s++;результати в $s=AA;.
    Це також працює у змішаному випадку: aZдо bA, A1до A2, A9до B0і z99Zдо aa00A.
    Декремент не працює на рядках. (І не входить NULL).
    Ще в PHP 3, $n="001";$n++;вироблений $n="002";. Мені трохи сумно, що вони це зняли.

Що б ви не займалися гольфом: завжди майте під рукою таблицю пріоритетності оператора .


4

Використовуйте ярлики

У звичайному коді, це хороша практика , щоб використовувати <?phpі ?>. Однак це не нормальний код - ви пишете код гольфу. Замість цього <?phpпишіть <?. Замість цього <?php echoпишіть <?=. Не друкуйте?> в кінці - це абсолютно необов’язково. Якщо вам потрібно ?>з якихось причин (наприклад, для виводу тексту, і він якось коротший, або щось таке, не ставте крапку з комою - це не потрібно, як ?>випливає з крапки з комою.

Неправильно (безумовно, занадто довго):

<?php echo ucfirst(trim(fgets(STDIN)));?>s!

Правильно:

<?=ucfirst(trim(fgets(STDIN)))?>s!

З -rпрапором ( який постачається безкоштовно ) ви взагалі не маєте жодних тегів (і вам заборонено використовувати жодні).
Тит

4

прокручування пасм

можна виконати з 26 байт або з 24 до 18:

foreach(str_split($s)as$c)  # A) 26 - general
for($p=0;a&$c=$s[$p++];)    # B) 24 - general
for($p=0;$c=$s[$p++];)      # C) 22 - if $s has no `0` character
for(;a&$c=$s[$p++];)        # D) 20 - if $p is already NULL or 0 (does NOT work for false)
for(;$c=$s[$p++];)          # E) 18 - both C and D

for(;$o=ord($s[$p++]);)     # F) 23 - work on ASCII codes, if $s has no NULL byte and D
for(;~$c=$s[$p++];)         # G) 19 - if $s has no chr(207) and D

$a&$bробить побітове І на (ASCII кодів) символи в $aі $b
й результати у вигляді рядка , яка має ту ж довжину, що і коротше , $aі $b.


Ви можете додати ord($s[$p++])як альтернативу for(;$s+=ord($argv[++$i])%32?:die($s==100););проти for(;$c=$argv[++$i];)$s+=ord($c)%32;echo$s==100;цього питання codegolf.stackexchange.com/questions/116933/…
Jörg Hülsermann

Please add ~ for cases you are working only with digits
Jörg Hülsermann

Note that PHP 7.2 yields warnings for the ~$c approach.
Titus

4

Use ternary operators

if(a==2){some code;}else{some other code;}

can be abbreviated to this:

(a==2?some code:some other code);

Shorter, huh?


“Conditional shorthands”? Better tell its real name, so those interested in more details can find it in the documentation: ternary operator.
manatwork

3
The question asks for tips which are somewhat specific to PHP. This is one included in the tips for all languages.
Peter Taylor

3
The ternary operator has a weird behaviour in PHP, if you nest it. a?aa:ab?aba:abb:b evaluates to (a?aa:ab)?(aba):(abb) or something like that.
Titus

1
And starting with PHP 5.3, you can omit the second operator: $a?:$b is the same as $a?$a:$b.
Titus

1
@Cyoce || casts to boolean in PHP.
Titus

3

by any other name ... function aliases

use ...

  • join instead of implode
  • chop instead of rtrim (chop in PERL is different!)
  • die instead of exit
  • fputs instead of fwrite
  • is_int instead of is_integer or is_long
  • is_real instead of is_float or is_double
  • key_exists instead of array_key_exists
  • mysql instead of mysql_db_query

... to name the most important aliases. Take a look at http://php.net/aliases for more.


Oh ... and did You know that die works with and without parameters? die(1) will exit the program with error code 1 (not completely sure on this; needs testing); die will exit with code 0, and die("Hello") will exit with code 0 after printing Hello.
Titus

3

Associative arrays can be merged with the + operator.

Instead of:

$merged = array_merge($a, $b);

Use:

$merged = $a + $b;

Note the + operator works with indexed arrays as well, but probably doesn't do what you want.


Indeed, frequently a good replacement, though not exactly the same: pastebin.com/seYeaP38
manatwork

Ah yeah, dang it, I originally had the title "associative arrays ... " and then removed it. I'll clarify, thanks.
Alex Howansky

numeric arrays can also merged using +, as long as the indexes are distinct. If they are not, the values from the first array will be overwritten with those from the second one (just like array_merge). The difference: + does not reorder indexes.
Titus

3

array_flip vs array_search

use

array_flip($array)[$value]

instead of

array_search($value,$array)

to save 1 Byte in arrays where the occurence of each value is unique


3

some interesting facts on variable variables

I just had to share them (even before I verified that at least one of them helps golfing):

  • Use letters: $x=a;$$x=1;$x++;$$x=2;echo"$a,$b"; prints 1,2
    but other arithmetic operations do not work with letters.
  • As primo mentioned earlier, you can use pure numbers as variable names:
    $a=1;$$a=5;$a++;$$a=4;${++$a}=3;echo${1},${2},${3}; prints 543.
  • You can not only use [0-9a-zA-Z_] for variable names, but EVERY string:
    $x="Hello!";$$x="Goodbye.";echo${"Hello!"}; prints Goodbye..
  • But: Everything but [a-zA-Z_][a-zA-Z_0-9]* as variable names requires braces for literal use.
  • With no variables defined, $$x=1 sets ${NULL}, which is the same as ${false} and ${""}.
  • $a=1;$$a=5; does not only set ${1}, but also ${true}.

  • one more, the weirdest one I´ve found so far: Try $a=[];$$a=3;echo${[]};. Yes, it prints 3!

The reason for most of this: variable names are always evaluated to strings.
(Thanks @Christoph for pointing out.)
So, whatever you get when you print or echo the expression, that´s what you get as variable name.


1
Variable names are converted to strings that explains the last three points on your list. [] converts to Array: ${[]} = 5;echo $Array; prints 5. I'm pretty sure you know that but it might not be obvious to everyone :)
Christoph

@Jeff I fixed the typo. Thanks for noticing.
Titus

2

line breaks
if the output requires line breaks, use a physical line break (1 byte) instead of "\n"
This also gives you a possible benefit to chose between single and double quotes.


2

avoid quotes where possible

PHP implicitly casts unknown words to literal strings.

$foo=foo; is the same as $foo='foo'; (assuming that foo is neither a key word or a defined constant): $foo=echo; does not work.

BUT: $p=str_pad; does; and $p(ab,3,c) evaluates to abc.

Using string literals without quotes will yield a Notice for Use of undefined constant; but that won´t show if you use the default value for error_reporting (CLI parameter -n).


I just noticed: This answer is a somewhat extended/updated duplicate of codegolf.stackexchange.com/a/2916/55735.
Titus

Note: PHP before 7.2 yielded Notices (which you can opress with the -n flag); 7.2 yields Warnings; later versions will throw Errors!
Titus

2

Arrow functions in PHP 7.4

PHP 7.4 is on RC2 version now and hopefully will be released in about 2 months. List of new features are here (this page can actually be updated when 7.4 is released). In 7.4, finally PHP has got the arrow functions, so not only function answers can be shorter now, but also passing closures to other functions can be a lot shorter too. Here are a few examples:

Return input + 1:

Anonymous function (closure) - 25 bytes - Try it online!

function($n){return$n+1;}

Arrow function - 12 bytes - Try it online!

fn($n)=>$n+1

Multiply items of first input (array of ints) by second input (int):

Anonymous function (closure) - 72 bytes - Try it online!

function($a,$n){return array_map(function($b)use($n){return$b*$n;},$a);}

Arrow function - 38 bytes - Try it online!

fn($a,$n)=>array_map(fn($b)=>$b*$n,$a)

Did you notice that $n is accessible in the inner function without a use $n statement? Yeah that is one of the arrow function features.


As a side note, I could not get arrow functions to work recursively (call the same arrow function inside itself), because we cannot give them a name and storing them as a closure in a variable like $f doesn't make $f accessible withing itself (sad). So this example doesn't work and using $f in first line causes a fatal error:

$f=fn($n)=>$n?$f($n-1):0;
$f(5); // Causes error: "PHP Notice: Undefined variable: f" + "PHP Fatal error: Uncaught Error: Function name must be a string"

But calling an arrow function withing a different arrow function works:

$f1=fn($n)=>$n+1;
$f2=fn($n)=>$f1($n-1);
$f1(2) // Returns 3
$f2(2) // Returns 2

What if instead of $f=fn($n)=>$n?$f($n-1):0; you do $f=$F=fn($n)=>$n?$F($n-1):0;? Would that work? And then you call $(5) as usual.
Ismael Miguel

@IsmaelMiguel it still seems to throw same error. You can actually try on tio.run#php yourself as Dennis has updated its PHP to 7.4 RC2 a while back.
Night2

Can't get it to work. Seems that only variables defined before are available.
Ismael Miguel


1

Directly dereference arrays returned from functions.

E.g., instead of this:

$a = foo();
echo $a[$n];

You can do:

echo foo()[$n];

This works with methods too:

echo $obj->foo()[$n];

You can also directly dereference array declarations:

echo [1, 2, 3, 4, 5][$n];

1

Use end() instead of array_pop()

The end() function doesn't just move the internal pointer to the end of the array, it also returns the last value. Note of course that it doesn't remove that value, so if you don't care what the array contains afterwards, you can use it instead of array_pop().


1

double array_flip vs in_array vs array_unique

in this special case a double array_flip saves 10 Bytes

($f=array_flip)($k=$f($c))) remove all double values in the array and I have dropped this $c=[], , |in_array($o,$c) and replace array_keys($c) with $k

for([,$x,$y]=$argv;a&$o=$y[$i];$i++)
$x[$i]==$o?:$c[$x[$i]]=$o; # if char string 1 not equal char string 2 set key=char1 value=char2
echo strtr($x,($f=array_flip)($k=$f($c)))==$y # boolean replacement string 1 equal to string 2
    ?join($k)." ".join($c) # output for true cases
:0; #Output false cases

Online Version

against

for($c=[],[,$x,$y]=$argv;a&$o=$y[$i];$i++)
  $x[$i]==$o|in_array($o,$c)?:$c[$x[$i]]=$o; # if char string 1 not equal char string 2 set key=char1 value=char2
echo strtr($x,$c)==$y # boolean replacement string 1 equal to string 2
  ?join(array_keys($c))." ".join($c) # output for true cases
  :0; #Output false cases

Online version

against array_unique it saves 2 Bytes

for([,$x,$y]=$argv;a&$o=$y[$i];$i++)
  $x[$i]==$o?:$c[$x[$i]]=$o; # if char string 1 not equal char string 2 set key=char1 value=char2
echo strtr($x,array_unique($c))==$y # boolean replacement string 1 equal to string 2
  ?join(array_keys($c))." ".join($c) # output for true cases
  :0; #Output false cases

Online Version

After finding a bug in this program and replacement $x[$i]==$o?:$c[$x[$i]]=$o to ($p=$x[$i])==$o?:$k[$c[$p]=$o]=$p the double array_flip was not necessary longer


associative safe array_unique. Yay!
Titus

@Titus I have add your suggestion
Jörg Hülsermann

1

intersecting strings

Have you ever used
join("DELIMITER",str_split($s)) (31 bytes) or even
preg_replace(".","DELIMITER",$s) (32 bytes)
?

There´s a builtin for that:

Try chunk_split($s,1,"DELIMITER") (29 bytes).


If you omit the third parameter, chunk_split will use \r\n; that can save you 7 or 8 bytes.

But beware: chunk_split also appends the delimiter to the string,
so you may not get exactly what you want.

(If you don´t provide the chunk length, it will use 76. Rather unusual for code golf, but who knows.)


Maybe you should add an example in combination with strtr I love this idea.
Jörg Hülsermann

1

unset() vs INF

In a case search for a minimum in an array you can use instead of

unset($var[$k]);

$var[$k]=INF;

to save 3 Bytes


1

str_repeat

In some cases you have a input of characters and you should output them repeated with an input greater zero for each characters.

for(;--$z?:($c=$argn[$i++]).$z=$argn[$i++];)echo$c;

(52 bytes) is shorter than

for(;~$c=$argn[$i++];)echo str_repeat($c,$argn[$i++]);

or

for(;~$c=$argn[$i++];)echo str_pad($c,$argn[$i++],$c);

(54 bytes each)

How it works for example input a1b2c1

$z is not set (implicit NULL), so --$z does nothing and is falsy;

$c="a", $z="1" and $i=2 -> $c.$z="a1" is truthy -> output "a"

--$z=0; so we set $c="b", $z="2" (and $i=4) -> $c.$z="b2" is truthy -> output "ab"

--$z=1 -> output "abb"

--$z=0; so we set $c="c" and $z=1 $c.$z="c1" is true output "abbc"

--$z=0 so $c="" and $z="" -> $c.$z="" is falsy -> loop breaks


1

Combining for loops

Suppose you have code of the following form:

for($pre1; $cond1; $post1) for($pre2; $cond2; $post2) $code;

this can generally be re-rolled in the following form:

for($pre1; $cond2  $post2 || $cond1  $pre2  $post1; ) $code;

where represents a generic combining operator. This usually results in an byte count reduction, but will likely require some creativity. $cond2 will need to be written so that it fails the first time through. $post1 should also fail to execute the first time, although it may be easier to refactor beforehand so that $post1 is not present.

If you're working with three or more nested loops, you can also combine two first, and then combine that to another, and so on. I find that it has generally been easier to combine from the inside outwards.


As an example, consider the following solution to the H-carpet fractal (97 bytes):

for(;$i<$n=3**$argn;$i+=print"$s\n")for($s=H,$e=1;$e<$n;$e*=3)$s.=str_pad($i/$e%3&1?$s:'',$e).$s;

This can be reformulated in the following way:

for(;($i+=$e&&print"$s\n")<$n=3**$argn;)for($s=H,$e=1;$e<$n;$e*=3)$s.=str_pad($i/$e%3&1?$s:'',$e).$s;

$e&&print prevents print on first iteration, and also does not increment $i.

and finally (93 bytes):

for(;$H>$e*=3or$e=($i+=$e&&print"$s\n")<${$s=H}=3**$argn;)$s.=str_pad($i/$e%3&1?$s:'',$e).$s;

$H>$e*=3 will fail the first time as both variables are undefined.


1

Removing characters in a string

join(explode(" ",$string));

saves 1 character compared to

str_replace(" ","",$string);

Note that this works for all (nonempty) strings, not just characters.
CalculatorFeline

@CalculatorFeline Why should it not work for empty strings? It make no sense or this case.
Jörg Hülsermann

Well, the first version doesn't work with "" and it's not very useful anyway.
CalculatorFeline

1
@CalculatorFeline And for this case a zero byte solution is much better. It make no sense to do this in that way.
Jörg Hülsermann

3
Your join example is missing a ). And strtr($string,[" "=>""]) is even shorter.
Titus


1

Use boolean operators instead of strtoupper() and strtolower()

If you're working exclusively with strings consisting of alphabet characters, you can use boolean operators to change them to uppercase or lowercase with fewer keystrokes than PHP's built-in functions.

Example:

// Convert lowercase to uppercase
$s = "g";
echo strtoupper($s);  // Outputs 'G', uses 20 characters
echo~" "&$s;          // Outputs 'G', uses 12 characters

// Convert uppercase to lowercase
$s = "G";
echo strtolower($s);  // Outputs 'g', uses 20 characters
echo$s^" ";           // Outputs 'g', uses 11 characters

// Switch case of each character
$s = "Gg";
echo$s^"  ";          // Outputs 'gG', uses 12 characters

Things are a little trickier for strings of arbitrary length, but the & and ^ operators will truncate the result to the length of the shorter input string. So for example, if $W is a string of spaces at least as long as any input $s, then ~$W&$s is equivalent to strtoupper($s), and $s|$W^$s is equivalent to strtolower($s) (whereas $s|$W by itself will produce a string with additional spaces unless $s and $W are of equal length).


0

use deprecated functions
If you can use POSIX instead of PERL regex without wasting more than 5 bytes on the expression, use ereg or eregi instead of preg_match, split or spliti instead of preg_split.
split Can also be used as a synonym for explode for most delimiters.

These functions are marked deprecated and will throw E_DEPRECATED notices, but (cannot find the source now) I think I have read that warnings and notices are ok.


2
Watch out! These were removed in PHP 7.0.
Umbrella
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.