Fungsi berguna yang sering dipakai di PHP

Bismillaahirrohmaanirrohiim…

Di bawah ini adalah fungsi yang berguna di PHP yang sering dipakai oleh programmer PHP.

Generate uniq ID

Biasanya di database MySQL programmer suka menggunakan autoincrement untuk primary key-nya, namun masalahnya akan muncul saat syncronisasi data dari beberapa database backup, karena bisa jadi nilai primary-nya sama.
Sebagai solusinya, programmer membuat sendiri fungsi yang menandai ID primary key benar-benar unik.

function getId() {
  $idt = explode(" ", microtime());
  $uniqid = $idt[1]. substr($idt[0], 2);
  return $uniqid.rand(1000,9999);
}
//hasil contoh: 1618802094566629001421 (22 digit)

atau

function getId() {
  return uniqid(rand(1000,9999),true);
  //tanpa titik
  //return str_replace('.', '', uniqid(rand(100,999),true));
}

//hasil contoh: 7408607ce1535575e0.35457382 (27 digit)

fungsi di atas bisa jadi masih berpotensi menghasilkan kode yang sama, silahkan ubah random angkanya sesuai kebutuhan.

Menampilkan teks saat kode dijalankan

Saat menjalankan program PHP, biasanya teks baru akan ditampilkan setelah kode pada file tersebut selesai dieksekusi.
Nah, untuk menampilkan text tanpa menunggu kode selesai diekseskusi fungsinya adalah sebagai berikut:

function print_cmd($txt) {
    echo $txt;

    @ob_end_flush();
    @ob_flush();
    flush();
    ob_start();
}

Menunggu user input saat php CLI dijalankan

function wait_user_input() {
    $handle = fopen ("php://stdin","r");
    $line = fgets($handle);
    fclose($handle);
    
    return trim($line);
}

Host tidak sama dengan domain kita

Jika kita punya website dengan IP address private, semua domain dapat diarahkan ke IP website kita.
Sehingga jika ada orang iseng membuat nama domain lain kemudian diarahkan ke IP website kita, jadinya web kita mempunyai banyak alamat website.
Contoh, IP server kita 123.123.123.123 bisa untuk domain webku.com, webmu.com, webkita.com dengan tampilan yang sama.
Agar setiap domain yang diarahkan ke IP server menjadi benar-benar domain milik kita, fungsinya adalah sbb:

if (strtolower($_SERVER['HTTP_HOST']) !== 'namadomainku.com') {
  header('location:https://namadomainku.com'.$_SERVER['REQUEST_URI']);
  exit();
}

Echo pre

Untuk memudahkan membaca array, daripada var_dump hehehe

Baca Juga:   Ajax post json dengan jquery dan PHP
function echoPre($arr) {
  echo '<pre>';
  print_r($arr);
  echo '</pre>';
}

Teks menjadi slug

Tujuan sudah jelas, agar link kita sesuai judul berita sehingga disukai search engine.

function textToSlug($text='') {
  $text = trim($text);
  if (empty($text)) return '';

    $text = preg_replace("/[^a-zA-Z0-9\-\s]+/", "", $text);
    $text = strtolower(trim($text));
    $text = str_replace(' ', '-', $text);
    $text = $text_ori = preg_replace('/\-{2,}/', '-', $text);

    return $text;
}

Slug menjadi text

Kebalikan dari teks menjadi slug, dari URL menjadi teks yang mudah dibaca manusia.

function slugToText($slug='') {
  $slug = trim($slug);
  if (empty($slug)) return '';

    $slug = str_replace('-', ' ', $slug);
    $slug = ucwords($slug);
    return $slug;
}

simpan html yang ditampilkan kedalam teks

Ini biasa dipakai saat ingin cache full page, beberapa plugin cache wordpress konsepnya dia membuat file statis (txt, html, dll) berdasarkan URL, jika sudah disimpan dalam cache saat ada akses ke URL tersebut tidak perlu query macem-macem, tinggal ambil dari cache yang disimpan tersebut.
berikut ini cara menyimpan teks, html, css, javascript ke dalam file statis.

$cached_file = dirname(__FILE__).'/cache/namacache.html';
ob_start();
//teks/html/css/javascript
@file_put_contents($cached_file, ob_get_contents());

Redirect http ke https dengan PHP

Kode di bawah ini  bisa digunakan untuk wordpress maupun untuk web PHP pada umumnya. Contoh ini jika dipakai di wordpress terbaru.

<?php
$host_http = 'yourdomain.com';

if (!isset($_SERVER['HTTP_HOST'])) $_SERVER['HTTP_HOST'] = $host_http;
if (!isset($_SERVER['REQUEST_URI'])) $_SERVER['REQUEST_URI'] = '';

if (strtolower($_SERVER['HTTP_HOST']) !== $host_http) {
  header('location:https://'.$host_http.$_SERVER['REQUEST_URI']);
  exit();
}

$protocol_web = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS']!=='off') || $_SERVER['SERVER_PORT']==443) ? 'https://':'http://';

if ($protocol_web==='http://') {
  header('location:https://'.$host_http.$_SERVER['REQUEST_URI']);
  exit();
}
/**
 * Front to the WordPress application. This file doesn't do anything, but loads
 * wp-blog-header.php which does and tells WordPress to load the theme.
 *
 * @package WordPress
 */

/**
 * Tells WordPress to load the WordPress theme and output it.
 *
 * @var bool
 */
define( 'WP_USE_THEMES', true );

/** Loads the WordPress Environment and Template */
require( dirname( __FILE__ ) . '/wp-blog-header.php' );

Set timezone asia jakarta

ini_set('date.timezone','Asia/Jakarta');
//bisa juga ditambahkan dibawahnya
date_default_timezone_set("Asia/Jakarta");

Mengambil nama file yang sedang diakses

//misal url = https://namadomain/blog/proses-data.php
basename(__FILE__, '.php');
output: proses-data

basename(__FILE__);
output: proses-data.php

Cek JSON valid atau tidak

$array = json_decode($json, true);
if (json_last_error() !== JSON_ERROR_NONE) {
    echo 'json not valid';
} else {
    echo 'json valid';
}

Hapus tag HTML dan isinya dengan PHP

<?php
//menghapus semua tag <table> tanpa property dan isinya
$html = preg_replace('#<table>(.*?)</table>#is', '', $html);

//menghapus semua tag <tr> yang mempunyai class dimulai "tebal"
$html = preg_replace('#<tr class=\"tebal(.*?)>(.*?)</tr>#is', '', $html);

//menghapus semua tag <script property> dan isinya, dengan property/attribute apa saja
$html = preg_replace('#<script(.*?)>(.*?)</script>#is', '', $html);

//menghapus semua tag <script property> dan isinya, dengan property/attribute apa saja
$html = preg_replace('/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/is', '', $html);

//menghapus semua tag <img property> dan isinya, dengan property/attribute apa saja
$html = preg_replace("/<img[^>]+\>/i", "", $html); 

Menghapus properti/atribut dari tag HTML

<?php
//menghapus property "type" dari tag <ul>, isinya tetap ada
$html = preg_replace('/<ul type="(.+?)">(.+?)<\/ul>/i', "<ul>$2</ul>", $html);

Menghapus isi dari property nya saja

//style akan dikosongkan/dihapus
preg_replace('/(<[^>]+) style=".*?"/i', '$1', $string);
//style akan dikosongkan/dihapus pada tag img
preg_replace('/(<img[^>]+) style=".*?"/i', '$1', $string);

Menghapus semua atribut di semua tag HTML

$teks = '<span class="abc" style="padding:10px;"><strong style="padding:10;margin:10;">ini teks tebal</strong></span>';
$teks = preg_replace("/<([a-z][a-z0-9]*)[^>]*?(\/?)>/si",'<$1$2>', $teks);
//hasilnya=> <span><strong>ini teks tebal</strong></span>

/*
penjelasan regex di atas
/              # Mulai Pattern
 <             # Cari '<' pada awalan setiap tag
 (             # Mulai group $1 nama tag
  [a-z]        # harus berisi 'a' sampai 'z'
  [a-z0-9]*    # harus berisi 'a' sampai 'z' atau angka '0' sampai '9'. 0 atau beberapa kali.
 )             # selesai Group tag
 [^>]*?        # temukan sesuatu selain tutup tag '>', 0 atau beberapa kali, apa saja
 (\/?)         # Mulai Group $2 - '/' jika ada
 >             # temukan tutup tag '>'
/is            # finish Pattern - Case Insensitive huruf besar dan kecil dan bisa Multi-line
*/

Membuat fungsi ago, konversi tanggal menjadi teks

//deprecate on php >= 8
function time_elapsed_string($datetime, $full = false) {
    $now = new DateTime;
    $ago = new DateTime($datetime);
    $diff = $now->diff($ago);

    $diff->w = floor($diff->d / 7);
    $diff->d -= $diff->w * 7;

    $string = array(
        'y' => 'year',
        'm' => 'month',
        'w' => 'week',
        'd' => 'day',
        'h' => 'hour',
        'i' => 'minute',
        's' => 'second',
    );
    foreach ($string as $k => &$v) {
        if ($diff->$k) {
            $v = $diff->$k . ' ' . $v . ($diff->$k > 1 ? 's' : '');
        } else {
            unset($string[$k]);
        }
    }

    if (!$full) $string = array_slice($string, 0, 1);
    return $string ? implode(', ', $string) . ' ago' : 'just now';
}

//updated
function time_elapsed_string($datetime, $full = false) {
   $timestamp = strtotime($datetime);   
   
   $strTime = array("second", "minute", "hour", "day", "month", "year");
   $length = array("60","60","24","30","12","10");

   $currentTime = time();
   if($currentTime >= $timestamp) {
        $diff     = time()- $timestamp;
        for($i = 0; $diff >= $length[$i] && $i < count($length)-1; $i++) {
        $diff = $diff / $length[$i];
        }

        $diff = round($diff);
        $s = ($diff > 1) ? 's' : '';
        return $diff . " " . $strTime[$i].$s . " ago ";
   }
   return 'just now';
}

Ukuran file menjadi human readable

function human_filesize($bytes, $dec = 2) {
    $size   = array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
    $factor = floor((strlen($bytes) - 1) / 3);

    return sprintf("%.{$dec}f", $bytes / pow(1024, $factor)) . @$size[$factor];
}

Cache file dengan waktu

$data_arr = array();
$file_cache = dirname(__FILE__).'/file_cache.json';
$getcache = false;

if (is_file($file_cache)) {

    $mod_time = filemtime($file_cache);
    $selisih_detik = time() - $mod_time;
    //$selisih_menit = floor(($selisih_detik%3600)/60);
    $selisih_menit = ($selisih_detik/60);
    if ($selisih_menit < 60) {
        $getcache = true;
    }
    //dipanggil terus bisa jadi curl dibawah gagal
    $hasils = file_get_contents($file_cache);
    $data_arr = json_decode($hasils, true);
}

Cara scan folder dan file dengan PHP

//iterasi file
$myfiles = array_diff(scandir(dirname(__FILE__).'/namafolder'), array('.', '..')); 
foreach ($myfiles as $fname_prev) {
	if (strpos($fname_prev, '~')!==false) continue;//biasanya untuk skip temporary file
}

Demikian beberapa fungsi yang berguna yang biasa digunakan programmer PHP untuk keperluan ngoding.

Monggo jika ada yang ingin menambahkan fungsi berguna atau ingin membuat fungsi lainnya.

Baca Juga:   Membuat pagination menjadi responsive pada bootstrap 4

Semoga bermanfaat…

Bagikan

You May Also Like

About the Author: rasupe

Leave a Reply

Your email address will not be published. Required fields are marked *