PHP Hypertext Preprocessor est un langage de scripts généraliste et Open Source, spécialement conçu pour le développement d’applications web. Il peut être intégré facilement au HTML et s’exécute sur un serveur http.
Voici une liste de quelques snippets utiles, complétée au fur et à mesure des besoins.
Définir une constante
1 |
defined( 'CONSTANT' ) || define( 'CONSTANT', $la_valeur_de_la_constante ); |
L’opérateur ||
permet de court-circuiter les opérations. Si le premier opérande est vrai, le second n’est alors pas évalué. Si le premier opérande est faux, le second est évalué, et la fonction define()
est exécutée.
Formulaire et checkbox
Lorsque l’on a une checkbox
dans un formulaire, si celle-ci est cochée elle envoie la valeur on
pour le nom de l’élément input
, si elle n’est pas cochée elle n’envoie rien. Si l’on veut obtenir la valeur 1
si elle est cochée ou 0
sinon, on doit tester l’existence de la variable envoyée. L’élément input est de la forme :
1 |
<input type="checkbox" name="myCheckbox"> |
Lorsque celle-ci est cochée, la balise contient également l’attribut checked
:
1 |
<input type="checkbox" name="myCheckbox" checked> |
Lorsque l’on reçoit la variable envoyée, en POST
par exemple, on teste l’existence de la variable $_POST['myCheckbox']
, on assigne 0
ou 1
avec la fonction intval()
:
1 2 |
intval( isset( $_POST['myChekbox'] ) ); // 0 si non cochée, 1 si cochée |
Supprimer un répertoire même s’il n’est pas vide
La fonction rmdir()
supprime un répertoire à la condition qu’il soit vide. On parcourt donc le répertoire récursivement afin de vider chaque sous-répertoire non vide et supprimer chaque fichier, afin d’appliquer en fin de compte rmdir()
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
/** * Removes a directory that is not empty * @param string directory path * @return bool true/false */ public function rmdir( $dir ) { if( ! is_dir( $dir ) ) { return false; } $dirIterator = new RecursiveDirectoryIterator( $dir, RecursiveDirectoryIterator::SKIP_DOTS ); $iterator = new RecursiveIteratorIterator( $dirIterator, RecursiveIteratorIterator::CHILD_FIRST ); foreach( $iterator as $fileInfo ) { if( $fileInfo->isDir() ) { if( ! rmdir( $fileInfo->getPathname() ) ) { return false; } } else { if( ! unlink( $fileInfo->getPathname() ) ) { return false; } } } if( ! rmdir( $dir ) ) { return false; } return true; } |
La fonction retourne true
en cas de succès, false
sinon.
Imprimer un arbre des dossiers et fichiers d’un répertoire
On utilise la classe RecursiveDirectoryIterator
et les classes associées :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
class My_Class { public function __construct() { $this->plugin_folder = // ... <- the plugin dirname for a WP Plugin } /** * Returns the tree * https://gist.github.com/hakre/3599532 */ private function getTree( $folder ) { $iterator = new RecursiveDirectoryIterator( $folder, RecursiveDirectoryIterator::KEY_AS_FILENAME | RecursiveDirectoryIterator::SKIP_DOTS); $tree = new RecursiveTreeIterator( $iterator ); $this->unicodeTreePrefix( $tree ); $output = "<div class=\"title\">{$folder}</div>"; $output .= "<pre class=\"files\">"; foreach( $tree as $filename => $file ) { $class="file"; // preg_match on unicode ├ won't work if( preg_match( "/\/{$this->plugin_folder}\/fonts\/[^\/]+$/", $file ) ) { $class = 'font-folder'; } $output .= "{$tree->getPrefix()}<span class=\"{$class}\">{$filename}</span><br>"; } $output .= "</pre>"; return $output; } /** * Nicely formatted directory listing */ private function unicodeTreePrefix( RecursiveTreeIterator $tree ) { $prefixParts = [ RecursiveTreeIterator::PREFIX_LEFT => ' ', RecursiveTreeIterator::PREFIX_MID_HAS_NEXT => '│ ', RecursiveTreeIterator::PREFIX_END_HAS_NEXT => '├ ', RecursiveTreeIterator::PREFIX_END_LAST => '└ ' ]; foreach ($prefixParts as $part => $string) { $tree->setPrefixPart($part, $string); } } } |
On obtient un arbre tel que celui-ci :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
/var/www/_blog/wp-content/plugins/icon-inserter/fonts ├ flaticon │ ├ svg │ │ └ 019-icon-inserter-grey.svg │ ├ license │ │ └ license.html │ ├ font │ │ ├ Flaticon.woff2 │ │ ├ Flaticon.eot │ │ ├ Flaticon.svg │ │ ├ _flaticon.scss │ │ ├ flaticon.css │ │ ├ Flaticon.woff │ │ ├ flaticon.html │ │ └ Flaticon.ttf │ └ backup.txt ├ murviel-info-beziers │ ├ fonts │ │ ├ murviel-info-beziers.ttf │ │ ├ murviel-info-beziers.svg │ │ ├ murviel-info-beziers.eot │ │ └ murviel-info-beziers.woff │ ├ icons-reference.html │ └ styles.css ├ fontello1-icon-inserter │ ├ README.txt │ ├ css │ │ ├ fontello1-icon-inserter-codes.css ... |
Obtenir la dernière valeur d’un tableau, ou la dernière clé :
1 |
$last_value = array_values( array_slice( $array, -1 ) )[0]; |
Par défaut array_slice() réordonnera et réinitialisera les indices entiers du tableau, on modifie ce comportement en définissant le dernier paramètre preserve_keys à true. Si l’on veut obtenir la dernière clé, à partir de PHP 7.3, on peut utiliser array_key_last(), sinon :
1 |
$last_key = key( array_slice( $array, -1, 1, true ) ); |
Fusionner deux tableaux sans valeurs en double :
1 2 3 4 |
$hooks_1 = [ 'hook1', 'hook2', 'hook3' ]; $hooks_2 = [ 'hook3', 'hook4' ]; $hooks = array_unique( array_merge( $hooks_1, $hooks_2 ) ); |
1 2 3 4 5 6 7 |
Array ( [0] => hook1 [1] => hook2 [2] => hook3 [4] => hook4 ) |
Et si l’on veut réindexer le tableau :
1 |
$hooks = array_values( $hooks ); |
1 2 3 4 5 6 7 |
Array ( [0] => hook1 [1] => hook2 [2] => hook3 [3] => hook4 ) |
Minifier un fichier CSS :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
function minimize_css( $path ) { $buffer = file_get_contents( $path ); $pattern = [ '/\/\*(.+?)\*\//s', // Skip comments '/[\r\n\t]/', // Line return, tab '/\s*([\{\}\:;,])\s*/' // blanks ]; $replace = [ '', '', '$1', ]; $buffer = preg_replace( $pattern, $replace, $buffer ); return $buffer; } |
$buffer contient le CSS minifié.
Obliger le navigateur à ne pas utiliser les fichiers en cache (js
, css
) :
Il peut être difficile d’effacer le cache du navigateur. Pour obliger celui-ci à télécharger la dernière version des js et css :
1 2 3 4 5 6 7 |
function force_browser_clearing_cache() { header( "Expires: Tue, 01 Jan 2000 00:00:00 GMT" ); header( "Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT" ); header( "Cache-Control: no-store, no-cache, must-revalidate, max-age=0" ); header( "Cache-Control: post-check=0, pre-check=0", false ); header( "Pragma: no-cache" ); } |
Obtenir un slug unique, non présent dans un tableau :
1 2 3 4 5 6 7 8 9 10 11 12 |
function unique_slug_from_array( $slug, $array ) { if( in_array( $slug, $array) ) { if( preg_match( '/-(\d+)$/', $slug, $matches ) ) { $slug = preg_replace( "/(\d+)$/", ++$matches[1], $slug ); } else $slug .= '-1'; $slug = unique_slug_from_array( $slug, $array ); } return $slug; } |
OpenSSL Encrypt Decrypt :
1 2 3 4 5 6 7 8 |
define( 'KEY', 'secret-string' ); // Change to what you want define( 'CYPHER', 'AES-128-ECB' ); $string = "I will be encrypted through openSSL"; $encrypted = openssl_encrypt( $string, CYPHER, KEY ); $decrypted = openssl_decrypt( $encrypted, CYPHER, KEY ); |
Obtenir une chaîne de caractères au hasard :
1 2 |
function random_string( $length = 10 ) { $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ&#{[(@])=}*%~|_-/ |
1 |
1 |
lt;>.;:,'; $length = strlen( $chars ); $string = ''; for( $i = 0; $i < $length; $i++ ) { $string .= $chars[rand( 0, $length - 1 )]; } return $string; } |
Filtrer un tableau :
On a un tableau :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Array ( [0] => clionautes [1] => cliotheque [2] => prepa [3] => lycee [4] => college [5] => cliotexte [6] => cine [7] => carto [8] => cliophoto [9] => crm ) |
et l’on filtre le tableau en enlevant les valeurs lycee et cine :
1 2 3 |
$array = array_filter( $array, function ( $value ) { return ! in_array( $value, array( 'lycee', 'cine' ) ); } ); |
et l’on obtient le tableau :
1 2 3 4 5 6 7 8 9 10 11 |
Array ( [0] => clionautes [1] => cliotheque [2] => prepa [4] => college [5] => cliotexte [7] => carto [8] => cliophoto [9] => crm ) |
Connaître la taille d’un dossier :
1 2 3 4 5 6 7 |
function folder_size( $dir ) { $size = 0; foreach( glob( rtrim( $dir, '/' ) . '/*', GLOB_NOSORT ) as $each ) { $size += is_file( $each ) ? filesize( $each ) : folderSize( $each ); } return $size; } |
Et hop, quelques snippets bien utiles pour la programmation PHP.