Skip to content

Instantly share code, notes, and snippets.

View stemar's full-sized avatar

Steven Marshall stemar

View GitHub Profile
@stemar
stemar / array_map_recursive.php
Created January 18, 2023 07:17
Recursive array_map()
<?php
function array_map_recursive($callback, $array) {
$func = function ($item) use (&$func, &$callback) {
return is_array($item) ? array_map($func, $item) : call_user_func($callback, $item);
};
return array_map($func, $array);
}
@stemar
stemar / mb_str_split.php
Last active February 10, 2025 15:47
Multibyte str_split(). The mbstring library PHP < 7.x doesn’t come with a multibyte equivalent of str_split(). This function behaves like mb_str_split in PHP >= 7.x
<?php
function mb_str_split($string, $length = 1, $encoding = NULL) {
if (!is_null($string) && !is_scalar($string)) {
$type = gettype($string) === 'object' ? get_class($string) : gettype($string);
throw new \Exception(sprintf('mb_str_split(): Argument #1 ($string) must be of type string, %s given', $type));
}
if ((!is_null($length) && !is_numeric($length)) || $length === '') {
$type = gettype($length) === 'object' ? get_class($length) : gettype($length);
throw new \Exception(sprintf('mb_str_split(): Argument #2 ($string) must be of type int, %s given', $type));
}
@stemar
stemar / mysqli_example.php
Last active September 14, 2022 21:15
Show MySQL types vs PHP types (MySQL formats) from a SELECT statement
<?php
// Connect
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = mysqli_connect('localhost', 'root', '');
printf("Connected: %s\n", mysqli_get_host_info($mysqli));
// Create database
$database = 'mysqli_example';
$sql = sprintf("CREATE DATABASE IF NOT EXISTS %s", $database);
@stemar
stemar / SVN_workflow.md
Last active April 13, 2021 19:05
SVN commands and workflow
@stemar
stemar / path.php
Created December 7, 2019 00:07
Normalize a path in PHP
<?php
/**
* Normalize a path.
*
* Usage: path('./one/', '/two/', 'three/');
* Result: "./one/two/three"
* @param array $parts
* @return string
*/
function path(...$parts) {
@stemar
stemar / vardump.php
Created September 15, 2019 05:52
PHP var_dump() without newline after =>
<?php
/**
* PHP var_dump() without newline after => .
*
* NOTE: The only issue is when a string value has `=>\n[ ]+`, it will get converted to `=> `
* @link https://www.php.net/manual/en/function.var-dump.php
*/
function vardump($value, $return=FALSE) {
ob_start();
var_dump($value);
@stemar
stemar / is_blank.php
Last active February 28, 2026 07:20
Check if a value is blank but not zero.
<?php
/**
* Check if a value is blank but not zero.
* When you need to accept these as valid, non-empty values:
* - 0 (0 as an integer)
* - 0.0 (0 as a float)
* - "0" (0 as a string)
*/
function is_blank(mixed $value): bool {
return empty($value) && @!is_numeric($value);
@stemar
stemar / format.php
Last active December 7, 2019 00:02
PHP format() function with named placeholders
<?php
/**
* Return a formatted string like vsprintf() with named placeholders.
*
* When a placeholder doesn't have a matching key in `$args`,
* the placeholder is returned as is to see missing args.
* @param string $string
* @param array $kwargs
* @param string $pattern
* @return string
@stemar
stemar / varexport.php
Last active December 22, 2022 05:06
PHP var_export() with short array syntax (square brackets) indented 2 spaces.
<?php
/**
* PHP var_export() with short array syntax (square brackets) indented 2 spaces.
*
* NOTE: The only issue is when a string value has `=>\n[`, it will get converted to `=> [`
* @link https://www.php.net/manual/en/function.var-export.php
* @param mixed $expression
* @param bool $return
* @return string
*/
@stemar
stemar / tidy_html5.php
Last active September 15, 2019 04:19
UTF-8 HTML5-compatible Tidy output
<?php
function tidy_html5($html, array $config = [], $encoding = 'utf8') {
$config += [
'doctype' => '<!DOCTYPE html>',
'drop-empty-elements' => 0,
'new-blocklevel-tags' => 'article aside audio bdi canvas details dialog figcaption figure footer header hgroup main menu menuitem nav section source summary template track video',
'new-empty-tags' => 'command embed keygen source track wbr',
'new-inline-tags' => 'audio command datalist embed keygen mark menuitem meter output progress source time video wbr',
'tidy-mark' => 0,
];