<?php //設置兩個redis key來支撐此問題 function getUserState($ip = ''){ if (empty($ip)) { return true; } //獲取封禁key $bannedKey = 'redis_cache_' . $ip; if ($redis->get($bannedKey)) { return true; } //獲取次數key $ipNumKey = 'redis_cache_num_'. $ip $ipNum = $redis->incr($ipNumKey); if ($ipNum >= 500) { $redis->setex($bannedKey,600); return false; } return true; } ?>
可考慮用redis的setbit和getbit命令來實現此需求,對其userId進行佔位,而且8各userId的佔位才佔有1B的空間,全部10M空間足足有餘php
<?php $nums = [1,2,3]; foreach ($nums as &$num) { //null } echo $nums[0].'-'.$num[1].'-'.$nums[2];//1-2-3 foreach ($nums as $num) { //null } echo $nums[0].'-'.$num[1].'-'.$nums[2];//1-2-2 ?>
若是不明白,則有直達地址:PHP引用那些事兒html
<?php //若是有經驗的RD,一眼就知道62個字符是0-9A-Za-z,而且在微博推出的短鏈服務就知道,這是一道通向短鏈設計的一個必經之路,具體短鏈服務不懂怎麼設計的自行google,這裏不作過多解釋 class Base62 { private $string = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; public function base62_encode($str) { $out = ''; for ($t = floor(log10($str) / log10(62)); $t >= 0; $t--) { $a = floor($str / pow(62, $t)); $out = $out . substr($this->string, $a, 1); $str = $str - ($a * pow(62, $t)); } return $out; } public function base62_decode($str) { $out = 0; $len = strlen($str) - 1; for ($t = 0; $t <= $len; $t++) { $out = $out + strpos($this->string, substr($str, $t, 1)) * pow(62, $len - $t); } return substr(sprintf("%f", $out) , 0, -7); } } $object = new Base62(); echo $object->base62_encode(1) . "<br/>"; echo $object->base62_encode(61) . "<br/>"; echo $object->base62_decode('z') . "<br/>"; ?>
若是隻知道PHP是拍簧片技術,而不懂看毛片算法,就low爆了,KMP算法講解redis
<?php function KMP($str) { $K = [0]; $M = 0; for ($i = 1; $i < strlen($str); $i++) { if ($str[$i] == $str[$M]) { $K[$i] = $K[$i - 1] + 1; $M++; } else { $M = 0; $K[$i] = $K[$M]; } } return $K; } // KMP查找 function KMPMatch($src, $par, $debug = false) { $K = KMP($par); for ($i = 0, $j = 0; $i < strlen($src);) { if ($j == strlen($par)) return $i - $j; echo $i, " ", $j, " ", $src[$i], $par[$j], "<BR>"; if ($par[$j] === $src[$i]) { $j++; $i++; } else { if ($j === 0 && $par[$j] != $src[$i]) { $i++; } $j = $K[$j - 1 >= 0 ? $j - 1 : 0]; } } return false; } //測試數據 $src = 'BBC ABCDAB ABCDABCDABDE'; $par = 'ABCDABD'; // 匹配值 echo "匹配值:", implode(" ", KMP($par)), "<BR>"; // 在給定的字符串中查找特定字符(串) echo KMPMatch($src, $par, true), "<BR>";
<?php function mb_strrev($str) { //判斷輸入的是否是utf8類型的字符,不然退出 if (!is_string($str) || !mb_check_encoding($str, 'UTF-8')) { exit("輸入類型不是UTF8類型的字符串"); } $array = array(); //將字符串存入數組 $l = mb_strlen($str, 'UTF-8'); for ($i = 0; $i < $l; $i++) { $array[] = mb_substr($str, $i, 1, 'UTF-8'); } //反轉字符串 krsort($array); //拼接字符串 $string = implode($array); return $string; } $str1 = "我是一箇中國人Chinese"; echo $str1 . "->" . mb_strrev($str1) . "<br>";
<?php /** * 二分查找算法 * 初始數組爲排好序的 * binary()非遞歸 * binaryRecursive() 遞歸 **/ $arr = [1, 3, 9, 23, 54]; function binary($arr, $low, $top, $target) { while ($low <= $top) { $mid = floor(($low + $top) / 2); if ($arr[$mid] == $target) { return $mid; } elseif ($arr[$mid] < $target) { $low = $mid + 1; } else { $top = $mid - 1; } } return -1; } function binaryRecursive($arr, $low, $top, $target) { if ($low <= $top) { $mid = floor(($low + $top) / 2); if ($arr[$mid] == $target) { return $mid; } elseif ($arr[$mid] < $target) { return binaryRecursive($arr, $mid + 1, $top, $target); } else { return binaryRecursive($arr, $low, $mid - 1, $target); } } else { return -1; } } echo binary($arr, 0, count($arr) , 9);//2 echo binaryRecursive($arr, 0, count($arr) , 9);//2 /** * 順序查找 **/ $arr = [1, 2, 3, 4]; function query_search($val) { global $arr; foreach ($arr as $k => $v) { if ($v == $val) { echo '順序查找成功,KEY=>' . $k; exit(0); } } echo '順序查找失敗!'; } echo query_search(3); //順序查找成功,KEY=>2 /** * 插入查找 * 數組數據須要有序 **/ $i = 0; function insertsearch($arr, $num) { $count = count($arr); $lower = 0; $high = $count - 1; global $i; while ($lower <= $high) { $i++; //計數器 if ($arr[$lower] == $num) { return $lower; } if ($arr[$high] == $num) { return $high; } $middle = intval($lower + ($num - $arr[$lower]) / ($arr[$high] - $arr[$lower]) * ($high - $lower)); if ($num < $arr[$middle]) { $high = $middle - 1; } else if ($num > $arr[$middle]) { $lower = $middle + 1; } else { return $middle; } } return -1; } $arr = [0, 1, 16, 24, 35, 47, 59, 62, 73, 88, 99]; $pos = insertsearch($arr, 62); echo $pos;//7 echo $i;//2 若是是折半查找的話i=3;
<?php /** * 快速排序算法 **/ $arr = [6, 3, 8, 6, 4, 2, 9, 5, 1]; //函數實現快速排序 function quick_sort($arr) { if (!is_array($arr)) { return false; } $length = count($arr); if ($length <= 1) { return $arr; } $left = $right = []; for ($i = 1; $i < $length; $i++) { //判斷當前元素的大小 if ($arr[$i] < $arr[0]) { $left[] = $arr[$i]; } else { $right[] = $arr[$i]; } } //遞歸調用 $left = quick_sort($left); $left[] = $arr[0]; $right = quick_sort($right); //將全部的結果合併 return array_merge($left, $right); } print_r(quick_sort($arr)); //Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 [6] => 6 [7] => 8 [8] => 9 )
<?php /** * 規則每行每列每宮的數字都是1-9個數字組成,不能重複 **/ class ShuDu { public $matrix; public function __construct($arr = null) { if ($arr == null) { $this->clear(); } else { $this->matrix = $arr; } } public function clear() { for ($i = 0; $i < 9; $i++) { for ($j = 0; $j < 9; $j++) { $this->matrix[$i][$j] = []; for ($k = 1; $k <= 9; $k++) { $this->matrix[$i][$j][$k] = $k; } } } } public function setCell($row, $col, $value) { $this->matrix[$row][$col] = [$value => $value]; //row for ($i = 0; $i < 9; $i++) { if ($i != $col) { if (!$this->removeValue($row, $i, $value)) { return false; } } } //col for ($i = 0; $i < 9; $i++) { if ($i != $row) { if (!$this->removeValue($i, $col, $value)) { return false; } } } //square $rs = intval($row / 3) * 3; $cs = intval($col / 3) * 3; for ($i = $rs; $i < $rs + 3; $i++) { for ($j = $cs; $j < $cs + 3; $j++) { if ($i != $row && $j != $col) { if (!$this->removeValue($i, $j, $value)) return false; } } } return true; } public function removeValue($row, $col, $value) { $count = count($this->matrix[$row][$col]); if ($count == 1) { $ret = !isset($this->matrix[$row][$col][$value]); return $ret; } if (isset($this->matrix[$row][$col][$value])) { unset($this->matrix[$row][$col][$value]); if ($count - 1 == 1) { return $this->setCell($row, $col, current($this->matrix[$row][$col])); } } return true; } public function set($arr) { for ($i = 0; $i < 9; $i++) { for ($j = 0; $j < 9; $j++) { if ($arr[$i][$j] > 0) { $this->setCell($i, $j, $arr[$i][$j]); } } } } public function dump() { for ($i = 0; $i < 9; $i++) { for ($j = 0; $j < 9; $j++) { $c = count($this->matrix[$i][$j]); if ($c == 1) { echo " " . current($this->matrix[$i][$j]) . " "; } else { echo "(" . $c . ")"; } } echo "<br/>"; } echo "<br/>"; } public function dumpAll() { for ($i = 0; $i < 9; $i++) { for ($j = 0; $j < 9; $j++) { echo implode('', $this->matrix[$i][$j]) , "\t"; } echo "<br/>"; } echo "<br/>"; } public function calc($data) { $this->clear(); $this->set($data); $this->_calc(); $this->dump(); } public function _calc() { for ($i = 0; $i < 9; $i++) { for ($j = 0; $j < 9; $j++) { if (count($this->matrix[$i][$j]) == 1) { continue; } foreach ($this->matrix[$i][$j] as $v) { $flag = false; $t = new Sudoku($this->matrix); if (!$t->setCell($i, $j, $v)) { continue; } if (!$t->_calc()) { continue; } $this->matrix = $t->matrix; return true; } return false; } } return true; } } $sd = new ShuDu(); $sd->calc([ [0, 5, 0, 0, 0, 6, 0, 9, 0], [0, 4, 7, 0, 8, 2, 6, 0, 0], [0, 8, 0, 0, 0, 7, 0, 5, 2], [7, 0, 1, 0, 3, 4, 0, 0, 6], [0, 3, 0, 0, 2, 0, 0, 8, 0], [2, 0, 0, 0, 0, 1, 9, 0, 4], [4, 7, 0, 1, 0, 0, 0, 6, 0], [0, 0, 9, 4, 6, 0, 3, 7, 0], [0, 1, 0, 2, 0, 0, 0, 4, 0], ]);
PHP是單繼承的語言,在PHP 5.4 Traits出現以前,PHP的類沒法同時從兩個基類繼承屬性或方法。php的Traits和Go語言的組合功能相似,經過在類中使用use關鍵字聲明要組合的Trait名稱,而具體某個Trait的聲明使用trait關鍵詞,Trait不能直接實例化,下面有篇文章比較詳細的介紹了此功能,PHP-Trait特性詳解算法
<?php /** * 深複製的原理是A的改變不會影響B的改變 * 淺複製的原理是A的改變會影響B的改變 **/ class ObjA { public $num = 0; public $objB; //包含的對象 function __construct() { $this->objB = new ObjB(); } //只有實現了下面方法聚合類 才能實現深複製 /*function __clone() { $this->objB = clone $this->objB; }*/ } class ObjB { public $num2 = 0; } //原型對象 $objA = new ObjA(); //複製對象(=複製引用) $objA2 = $objA; $objA2->num = 2; //隨着$objA2->num的變化 $objA->num也變化了 print_r($objA->num . '<br/>'); //結果爲2 print_r($objA2->num . '<br/>'); //結果爲2 //複製對象(‘clone’關鍵字克隆) $objA3 = clone $objA; $objA3->num = 4; //隨着$objA3->num的變化 $objA->num沒有變化 print_r($objA->num . '<br/>'); //結果爲2 print_r($objA3->num . '<br/>'); //結果爲4 //可是clone的對象(是聚合類)中包含其餘對象時所包含的對象(objB)複製的是引用 $objA3->objB->num2 = 7; print_r($objA3->objB->num2 . '<br/>'); //結果是7 print_r($objA->objB->num2 . '<br/>'); //結果是7