1. 程式人生 > >PHP奇淫技巧

PHP奇淫技巧

數量 翻轉 nat forward his implode else ajax ace

https://www.jb51.net/list/list_67_1.htm

PHP技巧:https://www.jb51.net/list/list_67_13.htm

PHP Post獲取不到非表單數據的問題解決辦法

問題描述

在使用vue-axios向後端post數據時,PHP端獲取不到post的數據。

問題解決

修改php.ini配置

找到php.ini配置文件,查找enable_post_data_reading變量,修改為打開狀態,註釋掉句前分好

?
1 2 3 4 5 6 7 8 ; Whether PHP will read the POST data.
; This option is enabled by default. ; Most likely, you won‘t want to disable this option globally. It causes $_POST ; and $_FILES to always be empty; the only way you will be able to read the ; POST data will be through the php://input stream wrapper. This can be useful ; to proxy requests or to process the POST data in a memory efficient fashion.
; http://php.net/enable-post-data-reading enable_post_data_reading = On //大約656行,修改此條

修改配置後,發現還是不行,繼續查閱資料。

獲取非表單數據

搜集資料之後,發現vue-axios向後端post的是非表單數據(Ajax不同),在獲取非表單數據時需要用php://input

?
1 2 $raw = file_get_contents(‘php://input‘);//獲取非表單數據 echo $raw;//輸出結果

PS:post時前端請求頭要設置為

?
1 2 3 headers: { "Content-type": "application/json; charset=utf-8" }

2:PHP生成指定範圍內的N個不重復的隨機數

思路:將生成的隨機數存入數組,再在數組中去除重復的值,即可生成一定數量的不重復隨機數。

在PHP網站開發中,有時候我們需要生成指定範圍內一定數量的不重復隨機數,具體怎麽設計這個生產隨機數的函數呢?我們可以將隨機產生的數存入數組,但在存入的同時去除重復的值,即可生成一定數量的不重復隨機數。當然也可以把指定範圍內的數值存進數組,再使用shuffle($array)打亂這個數組,然後再截取其中一定數量的值。但後面的一種做法在指定的隨機數範圍太大的時候會產生一個較大的數組。

下面給出第一種做法的代碼,第二種做法更簡單,大家可以嘗試下,其實也差不多

<?php
/*
* array unique_rand( int $min, int $max, int $num )
* 生成一定數量的不重復隨機數,指定的範圍內整數的數量必須
* 比要生成的隨機數數量大
* $min 和 $max: 指定隨機數的範圍
* $num: 指定生成數量
*/
function unique_rand($min, $max, $num) {
  $count = 0;
  $return = array();
  while ($count < $num) {
    $return[] = mt_rand($min, $max);
    $return = array_flip(array_flip($return));
    $count = count($return);
  }
  //打亂數組,重新賦予數組新的下標
  shuffle($return);
  return $return;
}
 
//生成10個1到100範圍內的不重復隨機數
$arr = unique_rand(1, 100, 10);
echo implode($arr, ",");
?>

程序運行如下:

48,5,19,36,63,72,82,77,46,16

補充幾點說明:

1、生成隨機數時我們用了 mt_rand() 函數。這個函數生成隨機數的平均速度要比 rand() 快幾倍。

2、去除數組中的重復值時用了“翻轉法”,就是用 array_flip() 把數組的 key 和 value 交換兩次。這種做法在去除數組重復值的同時效率也比用 array_unique() 快得多。

3、返回數組前,先使用 shuffle() 為數組賦予新的鍵名,保證鍵名是 0-n 連續的數字。如果不進行此步驟,可能在刪除重復值時造成鍵名不連續,如果用for遍歷的時候會有問題,但如果用foreach或不需要遍歷的時候可以不需要shuffle。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內容請查看下面相關鏈接

3:詳解PHP 二維數組排序保持鍵名不變

對二維數組指定的鍵名排序,首先大家想到的是array_multisort函數,關於array_multisort的用法我之前也寫了一篇廢話不多言,我們看個實例:

<?php
$data = array(
 1001 => array(
 ‘age‘ => 22,
 ‘name‘ => ‘鳩摩智‘
 ),
 1007 => array(
 ‘age‘ => 21,
 ‘name‘ => ‘慕容復‘
 ),
 1004 => array(
 ‘age‘ => 27,
 ‘name‘ => ‘喬幫主‘
 )
);
//根據字段age對數組$data進行升序排列 
 
$ages = array_column($data, ‘age‘); 
 
array_multisort($ages, SORT_ASC, $data); 
 
print_r($data);

技術分享圖片

技術分享圖片

細心的朋友會看到,鍵名重置了,鍵名從0開始,顯然這可能不是我們想要的結果,那如何保持鍵名不變?
我們再看個示例:

$data = array(
 1001 => array(
 ‘age‘ => 22,
 ‘name‘ => ‘鳩摩智‘
 ),
 1007 => array(
 ‘age‘ => 21,
 ‘name‘ => ‘慕容復‘
 ),
 1004 => array(
 ‘age‘ => 27,
 ‘name‘ => ‘喬幫主‘
 )
);
//根據字段age對數組$data進行降序排列
$data = arraySort($data, "age", "desc" );
print_r($data);
 
/**
 * @desc arraySort php二維數組排序 按照指定的key 對數組進行自然排序
 * @param array $arr 將要排序的數組
 * @param string $keys 指定排序的key
 * @param string $type 排序類型 asc | desc
 * @return array
 */
function arraySort($arr, $keys, $type = ‘asc‘)
{
 $keysvalue = $new_array = array();
 foreach ($arr as $k => $v) {
 $keysvalue[$k] = $v[$keys];
 }
 
 if ($type == ‘asc‘) {
 natsort($keysvalue);
 }
 if ($type == ‘desc‘) {
 natsort($keysvalue);
 $keysvalue = array_reverse($keysvalue, TRUE); // 將原數組中的元素順序翻轉,如果第二個參數指定為 true,則元素的鍵名保持不變
 }
 foreach ($keysvalue as $k => $v) {
 $new_array[$k] = $arr[$k];
 }
 return $new_array;
}

這裏我們也可以精簡下arraySort函數,處理結果相同:

/**
 * @desc arraySort php二維數組排序 按照指定的key 對數組進行自然排序
 * @param array $arr 將要排序的數組
 * @param string $keys 指定排序的key
 * @param string $type 排序類型 asc | desc
 * @return array
 */
function arraySort($arr, $keys, $type = ‘asc‘)
{
 $keysvalue = $new_array = array();
 foreach ($arr as $k => $v) {
 $keysvalue[$k] = $v[$keys];
 }
 
 $type == ‘asc‘ ? asort($keysvalue) : arsort($keysvalue);
 foreach ($keysvalue as $k => $v) {
 $new_array[$k] = $arr[$k];
 }
 return $new_array;
}

從上面的結果我們看到:技術分享圖片

鍵名保持了不變,實現的原理很簡單,先取出鍵名,然後對鍵名排序,再根據對應的鍵名賦值組成新數組返回。
大家可以看到,這裏我們主要用到了php的幾個核心的排序函數

asort() 對關聯數組按照鍵值進行升序排序。

arsort()對關聯數組按照鍵值進行降序排序。

natsort() 實現了“自然排序”,即數字從 1 到 9 的排序方法,字母從 a 到 z 的排序方法,短的優先。數組的索引與單元值保持關聯,

註意:在自然排序算法中,數字 2 小於 數字 10。在計算機排序算法中,10 小於 2,因為 "10" 中的第一個數字小於 2。

以上所述是小編給大家介紹的如何保持PHP 二維數組排序鍵名不變詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

您可能感興趣的文章:

  • PHP二維數組排序的3種方法和自定義函數分享
  • 一個PHP二維數組排序的函數分享
  • php二維數組排序方法(array_multisort usort)
  • php二維數組排序詳解

原文鏈接:https://www.cnblogs.com/phpper/p/10427969.html

4:PHP根據key刪除數組中指定的元素

php數組中元素的存在方式是以鍵值對的方式(‘key‘=>‘value‘),有時候我們需要根據鍵刪除數組中指定的某個元素。

function bykey_reitem($arr, $key){ 
  if(!array_key_exists($key, $arr)){ 
    return $arr; 
  } 
  $keys = array_keys($arr); 
  $index = array_search($key, $keys); 
  if($index !== FALSE){ 
    array_splice($arr, $index, 1); 
  } 
  return $arr; 
} 
$data = array(‘name‘=>‘apple‘,‘age‘=>12,‘address‘=>‘ChinaGuangZhou‘); 
$result = array_remove($data, ‘name‘); 
var_dump($result);

使用函數的說明:

1.array_search()

定義和用法

array_search() 函數與in_array()一樣,在數組中查找一個鍵值。如果找到了該值,匹配元素的鍵名會被返回。如果沒找到,則返回 false。

在 PHP 4.2.0 之前,函數在失敗時返回 null 而不是 false。

如果第三個參數 strict 被指定為 true,則只有在數據類型和值都一致時才返回相應元素的鍵名。

語法

?
1 array_search(value,array,strict)

參數 描述
value 必需。規定在數組中搜索的值。
array 必需。被搜索的數組。
strict 可選。可能的值:
true
false 默認
如果值設置為 true,還將在數組中檢查給定值的類型

例子 1

?
1 2 3 4 <?php $a=array("a"=>"Dog","b"=>"Cat","c"=>"Horse"); echo array_search("Dog",$a); ?>

2.array_splice()

定義和用法

array_splice()函數與array_slice()函數類似,選擇數組中的一系列元素,但不返回,而是刪除它們並用其它值代替。

如果提供了第四個參數,則之前選中的那些元素將被第四個參數指定的數組取代。

最後生成的數組將會返回。

語法

?
1 array_splice(array,offset,length,array)

參數 描述
array 必需。規定數組。
offset 必需。數值。如果 offset 為正,則從輸入數組中該值指定的偏移量開始移除。如果 offset 為負,則從輸入數組末尾倒數該值指定的偏移量開始移除。
length 可選。數值。如果省略該參數,則移除數組中從 offset到 結尾的所有部分。如果指定了 length 並且為正值,則移除這麽多元素。如果指定了 length 且為負值,則移除從 offset 到數組末尾倒數 length 為止中間所有的元素。
array 被移除的元素由此數組中的元素替代。如果沒有移除任何值,則此數組中的元素將插入到指定位置。

提示和註釋

提示:如果函數沒有刪除任何元素 (length=0),則替代數組將從start 參數的位置插入。

註釋:不保留替代數組中的鍵。

實例

<?php
  $a1=array(0=>"Dog",1=>"Cat",2=>"Horse",3=>"Bird");
  $a2=array(0=>"Tiger",1=>"Lion");
  array_splice($a1,0,2,$a2);
  print_r($a1);
  //輸出:
 Array ( [0] => Tiger [1] => Lion [2] => Horse [3] => Bird )
 ?>
 //與例子 1 相同,但是輸出返回的數組:
 <?php
  $a1=array(0=>"Dog",1=>"Cat",2=>"Horse",3=>"Bird");
  $a2=array(0=>"Tiger",1=>"Lion");
  print_r(array_splice($a1,0,2,$a2));
 ?>
 //輸出:
 Array ( [0] => Dog [1] => Cat )
 //length 參數設置為 0:
 <?php
  $a1=array(0=>"Dog",1=>"Cat");
  $a2=array(0=>"Tiger",1=>"Lion");
  array_splice($a1,1,0,$a2);
  print_r($a1);
?>
//輸出:
Array ( [0] => Dog [1] => Tiger [2] => Lion [3] => Cat )

6:PHP實現redis限制單ip、單用戶的訪問次數功能示例

本文實例講述了PHP實現redis限制單ip、單用戶的訪問次數功能。分享給大家供大家參考,具體如下:

有時候我們需要限制一個api或頁面訪問的頻率,例如單ip或單用戶一分鐘之內只能訪問多少次

類似於這樣的需求很容易用Redis來實現

<?php
$redis = new Redis();
$redis->connect(‘127.0.0.1‘, 6379);
$redis->auth("php001");
//這個key記錄該ip的訪問次數 也可改成用戶id
//$key = ‘userid_11100‘;
$key=get_real_ip();
//限制次數為5
$limit = 5;
$check = $redis->exists($key);
if($check){
  $redis->incr($key);
  $count = $redis->get($key);
  if($count > 5){
    exit(‘請求太頻繁,請稍後再試!‘);
  }
}else{
  $redis->incr($key);
  //限制時間為60秒
  $redis->expire($key,60);
}
$count = $redis->get($key);
echo ‘第 ‘.$count.‘ 次請求‘;
//獲取客戶端真實ip地址
function get_real_ip(){
  static $realip;
  if(isset($_SERVER)){
    if(isset($_SERVER[‘HTTP_X_FORWARDED_FOR‘])){
      $realip=$_SERVER[‘HTTP_X_FORWARDED_FOR‘];
    }else if(isset($_SERVER[‘HTTP_CLIENT_IP‘])){
      $realip=$_SERVER[‘HTTP_CLIENT_IP‘];
    }else{
      $realip=$_SERVER[‘REMOTE_ADDR‘];
    }
  }else{
    if(getenv(‘HTTP_X_FORWARDED_FOR‘)){
      $realip=getenv(‘HTTP_X_FORWARDED_FOR‘);
    }else if(getenv(‘HTTP_CLIENT_IP‘)){
      $realip=getenv(‘HTTP_CLIENT_IP‘);
    }else{
      $realip=getenv(‘REMOTE_ADDR‘);
    }
  }
  return $realip;
}
?>

PHP奇淫技巧