Apa tips umum yang Anda miliki untuk bermain golf di PHP? Saya mencari ide yang dapat diterapkan pada masalah kode golf secara umum yang setidaknya agak spesifik untuk PHP (mis. "Hapus komentar" bukan jawaban). Silakan kirim satu tip per jawaban.
Apa tips umum yang Anda miliki untuk bermain golf di PHP? Saya mencari ide yang dapat diterapkan pada masalah kode golf secara umum yang setidaknya agak spesifik untuk PHP (mis. "Hapus komentar" bukan jawaban). Silakan kirim satu tip per jawaban.
Jawaban:
Memahami bagaimana variabel dan spasi putih berinteraksi dengan konstruksi bahasa PHP.
Dalam golf waktu saya (memang singkat), saya telah menemukan bahwa konstruksi bahasa PHP (misalnya gema, return, untuk, sementara, dll) berperilaku dengan cara yang kurang intuitif ketika berinteraksi dengan variabel dan spasi.
echo$v;
, misalnya, sangat valid, sebagaimana adanya return$v;
dan konstruksi serupa lainnya. Pengurangan kecil ini di ruang putih dapat menyebabkan penurunan kumulatif yang signifikan dalam panjang.
Perlu diingat, bahwa variabel sebelum konstruksi bahasa memerlukan spasi setelah, seperti dalam contoh berikut:
foreach($a AS$b){}
Karena AS
merupakan konstruksi bahasa, spasi tidak diperlukan sebelum variabel $b
, tetapi jika ada yang menghilangkan spasi sebelum itu , menghasilkan $aAS
, ini akan diurai sebagai nama variabel dan menyebabkan kesalahan sintaks.
foreach($a[1]as$b)
tidak membutuhkan ruang putih. Ini bukan tentang konstruksi dan variabel bahasa, tetapi tentang ruang antara kata-karakter dari kata-kata yang berbeda.
echo $a+5." text"
tidak akan berfungsi karena PHP berpikir bahwa itu .
adalah titik desimal untuk 5
. Untuk membuatnya bekerja, Anda perlu menambahkan ruang seperti ini:echo $a+5 ." text"
echo$a+5," text";
. The echo
membangun memungkinkan Anda untuk melewati beberapa parameter. di mana orang harus menulis echo"result: ".($a+5)."!";
, Anda dapat menulis echo"result: ",$a+5,"!";
. Faktanya, meneruskan beberapa parameter ke sebuah echo
adalah optimasi mikro, karena kode akan berjalan sedikit lebih cepat (karena Anda tidak menggabungkan output, tetapi mengirimkannya secara terpisah). Untuk tantangan tentang penulisan kode tercepat, ini mungkin membantu sedikit sangat kecil.
echo
, tetapi tidak dengan print
(yang Anda perlukan jika Anda memasukkannya ke dalam ekspresi: echo
adalah konstruksi murni tanpa nilai balik sambil print
dapat bertindak sebagai fungsi: tidak memerlukan tanda kurung, tetapi selalu kembali int(1)
.
print
.
Gunakan string dengan bijak.
Jawaban ini dua kali lipat. Bagian pertama adalah ketika mendeklarasikan string, Anda dapat memanfaatkan konversi implisit PHP dari konstanta yang tidak diketahui ke string untuk menghemat ruang, misalnya:
@$s=string;
Hal @
ini diperlukan untuk mengganti peringatan yang akan dihasilkannya. Secara keseluruhan, Anda berakhir dengan pengurangan satu karakter.
adalah bahwa kadang-kadang, mungkin ruang yang efektif untuk mengatur variabel ke nama fungsi yang sering digunakan. Biasanya, Anda mungkin memiliki:
preg_match(..);preg_match(..);
Tetapi ketika bermain golf, ini dapat dipersingkat dengan mudah ke:
@$p=preg_match;$p(..);$p(..);
Dengan hanya dua contoh "preg_match", Anda hanya menyimpan satu karakter, tetapi semakin banyak Anda menggunakan fungsi, semakin banyak ruang yang akan Anda simpan.
E_DEPRECATED
) dapat diterima
php.ini
file
Anda tidak selalu perlu menulis cek bersyarat. Misalnya, beberapa kerangka kerja menggunakan ini di bagian atas file mereka untuk memblokir akses:
<?php defined('BASE_PATH')||die('not allowed');
Atau dalam fungsi normal
$value && run_this();
dari pada
if($value) { run_this(); }
Sejak PHP 5.4, array dapat dideklarasikan menggunakan tanda kurung siku (seperti halnya JavaScript) alih-alih array()
fungsinya:
$arr=['foo','bar','baz'];
// instead of
$arr=array('foo','bar','baz');
Ini akan menghemat lima byte.
Tetapi mungkin biaya byte jika Anda memiliki "lubang" dalam array asosiatif:
$arr=array(,1,,3,,5);
// is one byte shorter than
$arr=[1=>1,3=>3,5=>5];
kerugiannya hit sedikit kemudian jika Anda bisa mengisi lubang dengan nilai "kosong":
$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);
[,$a,$b,$c]=$argv;
.
Kecuali jika Anda melakukan manipulasi array, sebagian besar referensi ke indeks array $a[$i]
dapat diganti dengan sederhana $$i
. Ini bahkan benar jika indeks adalah bilangan bulat, karena bilangan bulat adalah nama variabel yang valid di PHP (meskipun literal akan memerlukan tanda kurung, misalnya ${0}
).
Pertimbangkan implementasi keran Rabonowitz Wagon berikut ini:
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;);
Ini dapat ditingkatkan dengan 6 byte, cukup dengan mengganti kedua referensi array $a[$g]
dengan $$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;);
Pelajari sebagian besar fungsi perpustakaan .
Pustaka PHP cukup besar dan menyediakan banyak fungsi mudah yang dapat sangat mempersingkat berbagai tugas. Anda bisa saja mencari setiap kali Anda mencoba melakukan sesuatu, tetapi melebihi membuang waktu Anda mungkin tidak menemukan apa pun yang cocok dengan pencarian khusus Anda. Cara terbaik adalah membiasakan diri dengan perpustakaan dan menghafal nama-nama fungsi dan apa yang mereka lakukan.
Menjalankan fungsi di dalam string.
Coba ini:
$a='strlen';
echo "This text has {$a('15')} chars";
Atau coba ini:
//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
Ini hanya berfungsi dengan menggunakan string ""
dan heredocs (JANGAN membuat kebingungan dengan nowdocs).
Menggunakan fungsi bersarang hanya mungkin di dalam heredocs bersarang (atau Anda akan mengalami kesalahan parse)!
you will run into parse errors
Saya tidak bisa membacanya sendiri? Bagaimana mesin Zend yang sial menyatukan ini
!!$foo
akan mengubah nilai kebenaran apa pun menjadi true
(atau 1
dalam output), nilai falsy (0, string kosong, array kosong) menjadi false
(atau output kosong)
Ini jarang diperlukan dalam kode golf, karena dalam banyak kasus di mana Anda memerlukan boolean, ada pemeran implisit pula.
(int)$foo
dapat ditulis sebagai $foo|0
atau foo^0
, tetapi mungkin membutuhkan tanda kurung.
Untuk booleans dan string, $foo*1
atau +$foo
bisa digunakan untuk cast ke int.
10
, Anda bisa menambahkan nol: *10
-> .0
. Tetapi dalam kasus ini, PHP akan mengambil titik sebagai titik desimal dan mengeluh. (Namun berbeda jika Anda memiliki jumlah nol nol dalam sebuah string.)join
sebagai ganti implode
. join($a)
lakukan hal yang samajoin('',$a)
$s=a;$s++;
menghasilkan $s=b;
. Ini berfungsi dengan karakter huruf besar dan kecil. $s=Z;$s++;
hasil dalam $s=AA;
. aZ
ke bA
, A1
ke A2
, A9
ke B0
dan z99Z
ke aa00A
. NULL
). $n="001";$n++;
diproduksi $n="002";
. Saya sedikit sedih mereka menghapus itu.Apa pun yang Anda main golf: selalu sediakan meja prioritas operator .
Dalam kode normal, itu praktik yang baik untuk digunakan <?php
dan ?>
. Namun, ini bukan kode normal - Anda sedang menulis kode kode golf. Alih-alih <?php
, tulis <?
. Alih-alih <?php echo
, tulis <?=
. Jangan mengetik ?>
di akhir - itu sepenuhnya opsional. Jika Anda perlu ?>
untuk beberapa alasan (misalnya untuk menghasilkan teks, dan entah bagaimana lebih pendek, atau sesuatu, jangan meletakkan tanda titik koma di depannya - itu tidak diperlukan, seperti yang ?>
menyiratkan titik koma.
Salah (pasti terlalu panjang):
<?php echo ucfirst(trim(fgets(STDIN)));?>s!
Benar:
<?=ucfirst(trim(fgets(STDIN)))?>s!
-r
bendera ( yang gratis ), Anda bahkan tidak diberi tag sama sekali (dan Anda tidak diizinkan menggunakannya).
perulangan melalui string
dapat dilakukan dengan 26 byte atau dengan 24 hingga 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
melakukan bitwise AND pada (kode ascii) karakter dalam $a
dan $b
dan menghasilkan string yang memiliki panjang yang sama dengan yang lebih pendek dari $a
dan $b
.
ord($s[$p++])
sebagai alternatif for(;$s+=ord($argv[++$i])%32?:die($s==100););
terhadap for(;$c=$argv[++$i];)$s+=ord($c)%32;echo$s==100;
pertanyaan ini codegolf.stackexchange.com/questions/116933/…
~
untuk kasus Anda hanya bekerja dengan angka
~$c
pendekatan tersebut.
if(a==2){some code;}else{some other code;}
dapat disingkat menjadi ini:
(a==2?some code:some other code);
Lebih pendek, ya?
a?aa:ab?aba:abb:b
mengevaluasi ke (a?aa:ab)?(aba):(abb)
atau sesuatu seperti itu.
$a?:$b
sama dengan $a?$a:$b
.
||
cast ke boolean dalam PHP.
gunakan ...
join
dari pada implode
chop
alih-alih rtrim
( chop
dalam PERL berbeda!)die
dari pada exit
fputs
dari pada fwrite
is_int
bukannya is_integer
atauis_long
is_real
bukannya is_float
atauis_double
key_exists
dari pada array_key_exists
mysql
dari pada mysql_db_query
... untuk menyebutkan nama alias yang paling penting. Lihatlah http://php.net/aliases untuk informasi lebih lanjut.
die
berfungsi dengan dan tanpa parameter? die(1)
akan keluar dari program dengan kode kesalahan 1
(tidak sepenuhnya yakin tentang ini; perlu pengujian); die
akan keluar dengan kode 0
, dan die("Hello")
akan keluar dengan kode 0
setelah mencetak Hello
.
+
operator.Dari pada:
$merged = array_merge($a, $b);
Menggunakan:
$merged = $a + $b;
Perhatikan bahwa +
operator juga bekerja dengan array yang diindeks, tetapi mungkin tidak melakukan apa yang Anda inginkan.
+
, selama indeksnya berbeda. Jika tidak, nilai-nilai dari array pertama akan ditimpa dengan yang dari array yang kedua (seperti array_merge). Perbedaannya: +
tidak menyusun ulang indeks.
menggunakan
array_flip($array)[$value]
dari pada
array_search($value,$array)
untuk menyimpan 1 Byte dalam array di mana kemunculan setiap nilai unik
beberapa fakta menarik tentang variabel variabel
Saya hanya harus membagikannya (bahkan sebelum saya memverifikasi bahwa setidaknya satu dari mereka membantu bermain golf):
$x=a;$$x=1;$x++;$$x=2;echo"$a,$b";
cetak 1,2
$a=1;$$a=5;$a++;$$a=4;${++$a}=3;echo${1},${2},${3};
cetakan 543
.[0-9a-zA-Z_]
untuk nama variabel, tetapi SETIAP string: $x="Hello!";$$x="Goodbye.";echo${"Hello!"};
cetakan Goodbye.
.[a-zA-Z_][a-zA-Z_0-9]*
sebagai nama variabel membutuhkan kawat gigi untuk penggunaan literal.$$x=1
set ${NULL}
, yang sama dengan ${false}
dan ${""}
. $a=1;$$a=5;
tidak hanya diatur ${1}
, tetapi juga ${true}
.
satu lagi, yang paling aneh yang saya temukan sejauh ini: Coba $a=[];$$a=3;echo${[]};
. Ya, itu mencetak 3
!
Alasan sebagian besar dari ini: nama variabel selalu dievaluasi ke string.
(Terima kasih @Christoph untuk menunjukkan.)
Jadi, apa pun yang Anda dapatkan ketika Anda print
atau echo
ekspresi, itulah yang Anda dapatkan sebagai nama variabel.
[]
dikonversi ke Array
: ${[]} = 5;echo $Array;
cetakan 5
. Saya cukup yakin Anda tahu itu, tetapi mungkin tidak jelas bagi semua orang :)
hindari kutipan jika memungkinkan
PHP secara implisit melemparkan kata-kata yang tidak dikenal ke string literal.
$foo=foo;
sama dengan $foo='foo';
(dengan asumsi itu foo
bukan kata kunci atau konstanta yang didefinisikan): $foo=echo;
tidak berfungsi.
TAPI: $p=str_pad;
apakah; dan $p(ab,3,c)
mengevaluasi ke abc
.
Menggunakan string literal tanpa tanda kutip akan menghasilkan Pemberitahuan untuk Use of undefined constant
; tetapi itu tidak akan muncul jika Anda menggunakan nilai default untuk error_reporting
(parameter CLI -n
).
-n
bendera); 7.2 menghasilkan Peringatan; versi yang lebih baru akan menampilkan Kesalahan!
PHP 7.4 sekarang dalam versi RC2 dan mudah-mudahan akan dirilis dalam waktu sekitar 2 bulan. Daftar fitur baru ada di sini (halaman ini sebenarnya dapat diperbarui ketika 7.4 dirilis). Pada 7.4, akhirnya PHP memiliki fungsi panah, jadi tidak hanya jawaban fungsi yang dapat lebih pendek sekarang, tetapi juga melewati penutupan ke fungsi lain juga bisa jauh lebih pendek. Berikut ini beberapa contoh:
Masukan kembali + 1:
Fungsi anonim (penutupan) - 25 byte - Cobalah online!
function($n){return$n+1;}
Fungsi panah - 12 byte - Cobalah online!
fn($n)=>$n+1
Lipat gandakan input pertama (array int) dengan input kedua (int):
Fungsi anonim (penutupan) - 72 byte - Cobalah online!
function($a,$n){return array_map(function($b)use($n){return$b*$n;},$a);}
Fungsi panah - 38 byte - Cobalah online!
fn($a,$n)=>array_map(fn($b)=>$b*$n,$a)
Apakah Anda memperhatikan bahwa $n
fungsi internal dapat diakses tanpa use $n
pernyataan? Ya itu adalah salah satu fitur fungsi panah.
Sebagai catatan, saya tidak bisa mendapatkan fungsi panah untuk bekerja secara rekursif (memanggil fungsi panah yang sama di dalam dirinya sendiri), karena kita tidak bisa memberi mereka nama dan menyimpannya sebagai penutup dalam variabel seperti $f
tidak membuat $f
diakses dengan sendirinya (sedih ). Jadi contoh ini tidak berfungsi dan menggunakan $f
di baris pertama menyebabkan kesalahan fatal:
$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"
Tetapi memanggil fungsi panah dengan fungsi panah yang berbeda berfungsi:
$f1=fn($n)=>$n+1;
$f2=fn($n)=>$f1($n-1);
$f1(2) // Returns 3
$f2(2) // Returns 2
$f=fn($n)=>$n?$f($n-1):0;
Anda tidak melakukannya $f=$F=fn($n)=>$n?$F($n-1):0;
? Apakah itu akan berhasil? Dan kemudian Anda menelepon $(5)
seperti biasa.
Mengenai file I / O:
Menautkan ke pertanyaan terkait lainnya , jawaban yang cocok di sini.
Misalnya, alih-alih ini:
$a = foo();
echo $a[$n];
Anda dapat melakukan:
echo foo()[$n];
Ini bekerja dengan metode juga:
echo $obj->foo()[$n];
Anda juga dapat langsung mendeklarasikan deklarasi array:
echo [1, 2, 3, 4, 5][$n];
end()
sebagai gantiarray_pop()
The end()
fungsi tidak hanya memindahkan pointer internal ke akhir array, juga mengembalikan nilai terakhir. Perhatikan tentu saja bahwa itu tidak menghapus nilai itu, jadi jika Anda tidak peduli apa isi array setelahnya, Anda dapat menggunakannya sebagai gantinya array_pop()
.
dalam kasus khusus ini, array_flip ganda menghemat 10 Bytes
($f=array_flip)($k=$f($c)))
hapus semua nilai ganda dalam array dan saya telah menjatuhkan ini $c=[],
, |in_array($o,$c)
dan ganti array_keys($c)
dengan$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
melawan
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
terhadap array_unique menghemat 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
Setelah menemukan bug dalam program ini dan penggantian $x[$i]==$o?:$c[$x[$i]]=$o
ke ($p=$x[$i])==$o?:$k[$c[$p]=$o]=$p
array_flip ganda tidak diperlukan lagi
array_unique
. Yay!
string berpotongan
Pernahkah Anda menggunakan
join("DELIMITER",str_split($s))
(31 byte) atau bahkan
preg_replace(".","DELIMITER",$s)
(32 byte)
?
Ada builtin untuk itu:
Coba chunk_split($s,1,"DELIMITER")
(29 byte).
Jika Anda menghilangkan parameter ketiga, chunk_split
akan digunakan \r\n
; yang dapat menghemat 7 atau 8 byte.
Namun berhati-hatilah: chunk_split
juga menambahkan pembatas pada string,
jadi Anda mungkin tidak mendapatkan apa yang Anda inginkan.
(Jika Anda tidak memberikan panjang chunk, itu akan menggunakan 76. Agak tidak biasa untuk golf kode, tetapi siapa yang tahu.)
strtr
Saya suka ide ini.
Dalam pencarian kasus untuk minimum dalam array, Anda dapat menggunakan sebagai gantinya
unset($var[$k]);
$var[$k]=INF;
untuk menyimpan 3 Bytes
Dalam beberapa kasus, Anda memiliki input karakter dan Anda harus menampilkannya berulang dengan input nol lebih besar untuk setiap karakter.
for(;--$z?:($c=$argn[$i++]).$z=$argn[$i++];)echo$c;
(52 byte) lebih pendek dari
for(;~$c=$argn[$i++];)echo str_repeat($c,$argn[$i++]);
atau
for(;~$c=$argn[$i++];)echo str_pad($c,$argn[$i++],$c);
(Masing-masing 54 byte)
a1b2c1
$z
tidak diatur (implisit NULL
), jadi --$z
tidak melakukan apa-apa dan palsu;
$c="a"
, $z="1"
dan $i=2
-> $c.$z="a1"
benar -> keluaran"a"
--$z=0
; jadi kita atur $c="b"
, $z="2"
(dan $i=4
) -> $c.$z="b2"
benar - output"ab"
--$z=1
-> output "abb"
--$z=0
; jadi kami mengatur $c="c"
dan $z=1
$c.$z="c1"
merupakan output yang benar"abbc"
--$z=0
begitu $c=""
dan $z=""
-> $c.$z=""
falsy -> loop break
for
loopMisalkan Anda memiliki kode dari formulir berikut:
for($pre1; $cond1; $post1) for($pre2; $cond2; $post2) $code;
ini umumnya dapat digulung kembali dalam bentuk berikut:
for($pre1; $cond2 • $post2 || $cond1 • $pre2 • $post1; ) $code;
di mana •
merupakan operator penggabungan generik. Ini biasanya menghasilkan pengurangan jumlah byte, tetapi kemungkinan akan membutuhkan beberapa kreativitas. $cond2
perlu ditulis agar gagal pertama kali. $post1
harus juga gagal mengeksekusi pertama kali, meskipun mungkin lebih mudah untuk refactor sebelumnya sehingga $post1
tidak ada.
Jika Anda bekerja dengan tiga atau lebih loop bersarang, Anda juga bisa menggabungkan dua terlebih dahulu, lalu menggabungkannya ke yang lain, dan seterusnya. Saya menemukan bahwa umumnya lebih mudah untuk menggabungkan dari dalam ke luar.
Sebagai contoh, pertimbangkan solusi berikut untuk fraktal H-carpet ( 97 byte) ):
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;
Ini dapat dirumuskan kembali dengan cara berikut:
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
mencegah print
pada iterasi pertama, dan juga tidak bertambah $i
.
dan akhirnya ( 93 byte ):
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
akan gagal pertama kali karena kedua variabel tidak terdefinisi.
join(explode(" ",$string));
menghemat 1 karakter dibandingkan dengan
str_replace(" ","",$string);
""
dan itu tidak terlalu berguna.
)
. Dan strtr($string,[" "=>""])
bahkan lebih pendek.
array_push($a,...$b);
lebih pendek satu byte dari
$a=array_merge($a,$b);
Tidak berfungsi sama dengan array asosiatif
strtoupper()
danstrtolower()
Jika Anda bekerja secara eksklusif dengan string yang terdiri dari karakter alfabet, Anda dapat menggunakan operator boolean untuk mengubahnya menjadi huruf besar atau kecil dengan penekanan tombol lebih sedikit daripada fungsi bawaan PHP.
// 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
Hal-hal sedikit lebih rumit untuk string dengan panjang sewenang-wenang, tetapi operator &
dan ^
akan memotong hasilnya dengan panjang string input yang lebih pendek. Jadi misalnya, jika $W
string spasi setidaknya selama input apa pun $s
, maka ~$W&$s
setara dengan strtoupper($s)
, dan $s|$W^$s
setara dengan strtolower($s)
(sedangkan $s|$W
dengan sendirinya akan menghasilkan string dengan spasi tambahan kecuali $s
dan $W
dengan panjang yang sama).
gunakan fungsi yang tidak digunakan lagi
Jika Anda dapat menggunakan POSIX sebagai ganti PERL regex tanpa membuang lebih dari 5 byte pada ekspresi, gunakan ereg
atau eregi
alih-alih preg_match
, split
atau spliti
alih-alih preg_split.
split
Dapat juga digunakan sebagai sinonim explode
untuk sebagian besar pembatas.
Fungsi-fungsi ini ditandai sudah usang dan akan membuang E_DEPRECATED
pemberitahuan, tetapi (tidak dapat menemukan sumbernya sekarang) Saya pikir saya telah membaca bahwa peringatan dan pemberitahuan itu ok.