主頁 > 後端開發 > PHP 開發工程師基礎篇 - PHP 陣列

PHP 開發工程師基礎篇 - PHP 陣列

2020-09-23 03:59:38 後端開發

陣列 (Array)

陣列是 PHP 中最重要的資料型別,可以說是掌握陣列,基本上 PHP 一大半問題都可以解決. PHP 陣列與其他編程語言陣列概念不一樣,其他編程語言陣列是由相同型別的元素(element)的集合所組成的資料結構,而 PHP 陣列元素可以為不同型別的元素,因此說 PHP 陣列不是純粹的陣列,而是哈希 (字典) 更為恰當.
PHP 陣列可以當作真正的陣列,或串列(向量),散串列(是映射的一種實作),字典,集合,堆疊,佇列以及更多可能性,陣列分為關聯陣列 (類似字典) 和索引陣列 (純陣列,鍵值從數字開始,一般從 0 開始).

  • PHP 陣列底層實作
  • 詳解 PHP 陣列的底層實作:HashTable

語法

  • array
    $arr = array(1, 2, 3);

     

  • []
    $arr = [1, 2, 3];

     

    陣列鍵值注意事項

PHP 陣列的鍵值僅支持字串 (string) 和整型 (integer). 其他型別均會轉換數字或字串,浮點型別會被轉換為整型型別的,8.7->8. 布爾型別則會轉換為整型型別的,true->1, false->0. Null 會被轉換為空的字串,陣列和物件則不會轉換成為字串型別和整型,會拋出一個警告: Illegal offset type.

注意的是字串型別假如是有效十進制數字的話,則會轉換為整型. "8"->8. 若不想轉換則在數字前添加 "+" 符號.

 1 // 02不是有效十進制數字
 2 $arr = ['1' => 'a', '+1' => 'b', '02' => 'c'];
 3 /**
 4  array(3) {
 5   [1]=>
 6   string(1) "a"
 7   ["+1"]=>
 8   string(1) "b"
 9   ["02"]=>
10   string(1) "c"
11 }
12  */
13 var_dump($arr);
14 // 陣列的鍵值可以不用有鍵值, 下面這個陣列最大數字是6,所以在它后面的元素,則是在它基礎上+1
15 $array = array(
16          "a",
17          "b",
18     6 => "c",
19          "d",
20 );
21 /**
22  array(4) {
23   [0]=>
24   string(1) "a"
25   [1]=>
26   string(1) "b"
27   [6]=>
28   string(1) "c"
29   [7]=>
30   string(1) "d"
31 }
32  */
33 var_dump($array);

 

陣列基本操作 (增刪改查)

通過在方括號 ([]) 內指定鍵名來給陣列賦值實作的增加和修改元素,也可以省略鍵名.

  • 增加陣列的元素
    1 // 索引陣列
    2 $arr = [1, 2, 3];
    3 $arr[] = 4; // [1, 2, 3, 4]
    4 // 關聯陣列
    5 $arr1 = ['a' => 1, 'b' => 2];
    6 $arr1['c'] = 3; // ['a' => 1, 'b' => 2, 'c' => 3]
    7 // 混合陣列
    8 $arr3 = ['a' => 1, 'b' => 2];
    9 $arr3[1] = 3; // ['a' => 1, 'b' => 2, 1 => 3]

     

  • 洗掉陣列的元素
     1 $arr = [1, 2, 3];
     2 // 洗掉陣列中值為3的, 注意的是陣列不會被重新索引(索引陣列)
     3 unset($arr[2]);
     4 $arr[] = 3;
     5 /**
     6 array(3) {
     7 [0]=>
     8 int(1)
     9 [1]=>
    10 int(2)
    11 [3]=>
    12 int(3)
    13 }
    14 */
    15 var_dump($arr);

     

  • 改變陣列的元素
    $arr = [1, 2, 3];
    $arr[0] = 'a';
    var_dump($arr); ['a', 2, 3]
  • 查詢陣列的元素
    $arr = [1, 2, 3];
    var_dump($arr[0]); // 1

其他型別轉換為陣列

除了物件 (Object) 轉換陣列外,對于對于任意 integer,float,string,boolean 和 resource 型別,如果將一個值轉換為陣列,將得到一個僅有一個元素的陣列,其下標為 0.
(array)$scalarValue 與 array ($scalarValue) 一樣,而物件 (object) 型別轉換為 array. 其單元為該物件的屬性,鍵名將為成員變數名,不過有幾點例外:整數屬性不可訪問;私有變數前會加上類名作前綴;保護變數前會加上一個 '*' 做前綴,這些前綴的前后都各有一個 NULL 字符,這會導致一些不可預知的行為:

class A {
    private $A; // This will become '\0A\0A'
}

class B extends A {
    private $A; // This will become '\0B\0A'
    protected $B // This will \0*\0A
    public $AA; // This will become 'AA'
}
// 會有兩個鍵名為 'AA',不過其中一個實際上是 '\0A\0A',
/**
 array(4) {
  ["BA"]=>
  NULL
  ["*B"]=>
  NULL
  ["AA"]=>
  NULL
  ["AA"]=>
  NULL
}
 */
var_dump((array) new B());
  • 整數屬性

陣列函式分類

  1. 創建陣列

    • array_combine (array $keys , array $values) : array — 創建一個陣列,用一個陣列的值作為其鍵名,另一個陣列的值作為其值
      $key = ['a', 'b', 'c'];
      $value = https://www.cnblogs.com/a609251438/p/[1, 2, 3];
      print_r(array_combine($key, $value)); // ['a' => 1, 'b' => 2, 'c' => 3]
    • array_fill_keys (array $keys , mixed $value) : array — 使用指定的鍵和值填充陣列
      $keys = ['red', 'blue', 'green'];
      var_dump(array_fill_keys($keys, 1)); // ['red' => 1, 'blue' => 1, 'green' => 1]
    • array_fill (int $start_index , int $num , mixed $value) : array — 用給定的值填充陣列
      var_dump(array_fill(0, 0, 1)); // []
      var_dump(array_fill(1, 3, 'red')); // [1=>'red', 2=>'red', 3=>'red']
    • array — 新建一個陣列
      // array() 是語言結構, 不是常規函式
      $a = array(1, 2, 3);
    • compact (mixed $varname1 [, mixed $...] ) : array — 建立一個陣列,包括變數名和它們的值
      $a = 'apple';
      $b = 'banana';
      $d = 'lemon';
      $sweet = ['b', 'd'];
      $result = compact('a', $sweet); // ['a' => 'apple', 'b' => 'banana', 'd' => 'lemon']
    • range (mixed $start , mixed $end [, number $step = 1] ) : array — 根據范圍創建陣列,包含指定的元素
      var_dump(range(1, 5)); // [1, 2, 3, 4, 5]
      var_dump(range(0, 100, 10)); // [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
  2. 陣列分割

    • array_chunk (array $array , int $size [, bool $preserve_keys = FALSE] ) : array — 將一個陣列分割成多個
      $a = ['a' => 1, 'B' => 2, 3 => 'c', 'A' => 4, 'b' => 6];
      print_r(array_chunk($a, 2)); // [[1, 2], ['c', 4], [6]]
      print_r(array_chunk($a, 2, true)); // [['a' => 1, 'B' => 2], [3 => 'c', 'A' => 4], ['b' => 6]]
    • array_slice (array $array , int $offset [, int $length = NULL [, bool $preserve_keys = FALSE]] ) : array — 從陣列中取出一段
      $input = ['a', 'b', 'c', 'e', 'f'];
      var_dump(array_slice($a, 2)); // ['c', 'e', 'f']
      var_dump(array_slice($a, 2, 1)); // ['c']
      var_dump(array_slice($a, -1, 1)); // ['f']
      var_dump(array_slice($a, -1, 1, true)); [4 => 'f']
      var_dump(array_slice($a, 0, 6)); // ['a', 'b', 'c', 'e', 'f']
  3. 陣列佇列或堆疊操作

    • array_pop (array &$array) : mixed — 彈出陣列最后一個單元(出堆疊)
      $arr1 = ['yellow', 'green', 'red']
      var_dump(array_pop($arr1)); // 'yellow'
    • array_push (array &$array [, mixed $...] ) : int — 將一個或多個單元壓入陣列的末尾(入堆疊)
      var_dump(array_push([1, 2, 3], 4, 5)) // 2 
    • array_shift (array &$array) : mixed — 將陣列開頭的單元移出陣列
      $a ['php', 'c', 'python'];
      var_dump(array_shift($a));// 'php'
    • array_unshift (array &$array [, mixed $...] ) : int — 在陣列開頭插入一個或多個單元
      $queue = ['orange', 'banana'];
      var_dump(array_unshift($queue, 'apple')); // 3
      var_dump($queue);
  4. 陣列數學運算

    • array_count_values (array $array): array — 統計陣列中所有的值
      print_r(array_count_value([1, 'hello', 1, 'hello', 'world'])) // [1=>2, 'hello' => 2, 'world' => 1]
    • array_product (array $array) : number — 計算陣列中所有值的乘積
      $a = array(2, 4, 6, 8);
      var_dump(array_product($a));// 384
      var_dump(array_product([])); // 1
    • array_reduce ( array $array , callable $callback [, mixed $initial = NULL ] ) : mixed
      function sum ($carry, $item) {
      $carry += $item;
      return $carry;
      }
      $a = [1, 2, 3, 4, 5];
      var_dump(array_reduce($a, 'sum')); // 15
      var_dump(array_reduce($a, 'sum', 10)); // 25
    • array_sum (array $array) : number — 對陣列中所有值求和
      var_dump(array_sum([1, 2, 3])); // 6
      var_dump(array_sum([])); // 0
  5. 陣列鍵值操作

    • array_change_key_case (array $array [, int $case = CASE_LOWER] ) : array — 將陣列中的所有鍵名修改為全大寫或小寫
      $a = ['a' => 1, 'B' => 2, 3 => 'c', 'A' => 4];
      print_r(array_change_key_case($a)); // ['a' => 4, 'b' => 2, 3 => 'c']
      print_r(array_change_key_case($a, CASE_UPPER)); // ['A' => 4, 'B' => 2, 3 => 'c']
    • array_key_exists (mixed $key , array $array) : bool — 檢查陣列里是否有指定的鍵名或索引
      var_dump(array_key_exists('first', ['first' => 1, 'second' => 2])); // true
    • array_key_first (array $array) : mixed — 獲取陣列第一個鍵值
      = 7.3.0/nvar_dump(array_key_first(['a' => 1, 'b' => 2])); // 'a'","classes":{"has":1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet">// php >= 7.3.0
      var_dump(array_key_first(['a' => 1, 'b' => 2])); // 'a'
    • array_key_last (array $array) : mixed — 獲取陣列最后一個鍵值
      = 7.3.0/nvar_dump(array_key_last(['a' => 1, 'b' => 2])); // 'b'","classes":{"has":1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet">// php >= 7.3.0
      var_dump(array_key_last(['a' => 1, 'b' => 2])); // 'b'
    • array_keys (array $array , mixed $search_value [, bool $strict = FALSE] ) : array | array_keys ( array $array ) : array — 回傳陣列中部分的或所有的鍵名
      $a = ['a' => 1, 'b' => 2, 'c' => 3];
      var_dump(array_keys($a)); // ['a', 'b', 'c']
      var_dump(array_keys($a, '1')); // 'a'
      var_dump(array_keys($a, '1', true)); // []
    • key_exists — 別名 array_key_exists
  6. 陣列元素操作

    • array_pad (array $array , int $size , mixed $value) : array — 以指定長度將一個值填充進陣列
      $input = [12, 10, 9];
      var_dump(array_pad($input, 5, 2)); // [12, 10, 9, 2, 2]
      var_dump(array_pad($input, -5, 2)); // [2, 2, 12, 10, 9]
      var_dump(array_pad($input, 4, [1])); // [12, 10, 9, [1]]
    • array_rand (array $array [, int $num = 1] ) : mixed — 從陣列中隨機取出一個或多個單元
      var_dump(array_rand([1, 2, 3], 2)); // [1, 3]
    • array_search (mixed $needle , array $haystack [, bool $strict = FALSE] ) : mixed — 在陣列中搜索給定的值,如果成功則回傳首個相應的鍵名
      $a = [1, 'blue', 'red', 'php', 0];
      var_dump(array_search('php', $a)); // 2
      var_dump(array_search(false, $a)); // 3
      var_dump(array_search(false, $a, true)); // false
    • array_values (array $array) : array — 回傳陣列中所有的值
      $a = ['a' => 1, 'b' => 2];
      var_dump(array_value($a)); // [1, 2]
    • in_array (mixed $needle , array $haystack [, bool $strict = FALSE] ) : bool 檢查陣列中是否存在某個值
      // 字串比較是大小寫敏感
      $os = ['Mac', 'NT', 'Irix', 'Linux', 1];
      var_dump(in_array('Linux', $os)); // true
      var_dump(in_array('1', $os)); //true
      var_dump(in_array('1a', $os)); //true
      // 開啟嚴格型別比較
      var_dump(in_array('1', $os, true)); // false
  7. 陣列交集與差集,合并

    • array_diff_assoc (array $array1 , array $array2 [, array $...] ) : array — 帶索引檢查計算陣列的差集
       /"green/", /"b/" => /"brown/", /"c/" => /"blue/", /"red/"];/n$array2 = [/"a/" => /"green/", /"yellow/", /"red/"];/nprint_r(array_diff_assoc($array1, $array2)); // [/"b/" => /"brown/", /"c/" => /"blue/", 0 => /"red/"]","classes":{"has":1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet">$array1 = ["a" => "green", "b" => "brown", "c" => "blue", "red"];
      $array2 = ["a" => "green", "yellow", "red"];
      print_r(array_diff_assoc($array1, $array2)); // ["b" => "brown", "c" => "blue", 0 => "red"]
    • array_diff_key (array $array1 , array $array2 [, array $...] ) : array — 使用鍵名比較計算陣列的差集
      $array1 = ['blue' => 1, 'red' => 2]; 
      $array2 = ['green' => 2, 'blue' => 1];
      print_r(array_diff_key($array1, $array2)); // ['red' => 2];
    • array_diff_uassoc (array $array1 , array $array2 [, array $...], callable $key_compare_func ) : array — 用用戶提供的回呼函式做索引檢查來計算陣列的差集
       $b)? 1:-1;\n}\n$array1 = array(\"a\" => \"green\", \"b\" => \"brown\", \"c\" => \"blue\", \"red\");\n$array2 = array(\"a\" => \"green\", \"yellow\", \"red\");\n$result = array_diff_uassoc($array1, $array2, \"key_compare_func\");\nprint_r($result); // [\"b\" => \"brown\", \"c\" => \"blue\", \"red\"]","classes":{"has":1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet">function key_compare_func($a, $b)
      {
       if ($a === $b) {
           return 0;
       }
      return ($a > $b)? 1:-1;
      }
      $array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
      $array2 = array("a" => "green", "yellow", "red");
      $result = array_diff_uassoc($array1, $array2, "key_compare_func");
      print_r($result); // ["b" => "brown", "c" => "blue", "red"]
    • array_diff_ukey (array $array1 , array $array2 [, array $...], callable $key_compare_func ) : array — 用回呼函式對鍵名比較計算陣列的差集
       $key2) {/n     return 1;/n } else {/n     return -1;/n }/n}/n$array1 = ['blue' => 1, 'red' => 2, 'green' => 3];\n$array2 = ['green' => 5, 'blue' => 6, 'yellow' => 8];\nvar_dump(array_diff_ukey($array1, $array2, 'key_compare_func')); // ['red' => 2]","classes":{"has":1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet">function key_compare_func($key1, $key2)
      {
       if ($key1 == $key2) {
           return 0;
       } else if ($key1 > $key2) {
           return 1;
       } else {
           return -1;
       }
      }
      $array1 = ['blue' => 1, 'red' => 2, 'green' => 3];
      $array2 = ['green' => 5, 'blue' => 6, 'yellow' => 8];
      var_dump(array_diff_ukey($array1, $array2, 'key_compare_func')); // ['red' => 2]
    • array_diff (array $array1 , array $array2 [, array $...] ) : array — 計算陣列的差集
      $array1 = ['red', 'blue', 'green'];
      $array2 = ['red', 'yellow', 'hello'];
      $array3 = ['green', 'world'];
      var_dump(array_diff($array1, $array2, $array3)); // ['blue']
    • array_intersect_assoc (array $array1 , array $array2 [, array $...] ) : array — 帶索引檢查計算陣列的交集
       /"green/", /"b/" => /"brown/", /"c/" => /"blue/", /"red/");/n$array2 = array(/"a/" => /"green/", /"b/" => /"yellow/", /"blue/", /"red/");/n$result_array = array_intersect_assoc($array1, $array2);/nprint_r($result_array); // ['a' => 'green']","classes":{"has":1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet">$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
      $array2 = array("a" => "green", "b" => "yellow", "blue", "red");
      $result_array = array_intersect_assoc($array1, $array2);
      print_r($result_array); // ['a' => 'green']
    • array_intersect_key (array $array1 , array $array2 [, array $...] ) : array — 使用鍵名比較計算陣列的交集
      $array1 = array('blue'  => 1, 'red'  => 2, 'green'  => 3, 'purple' => 4);
      $array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan'   => 8);
      var_dump(array_intersect_key($array1, $array2)); // ['blue' => 1, 'green'=>5]
    • array_intersect_uassoc ( array $array1 , array $array2 [, array $... ], callable $key_compare_func ) : array
      — 帶索引檢查計算陣列的交集,用回呼函式比較索引
       /"green/", /"b/" => /"brown/", /"c/" => /"blue/", /"red/"];/n$array2 = [/"a/" => /"GREEN/", /"B/" => /"brown/", /"yellow/", /"red/"];/nvar_dump(array_intersect_uassoc($array1, $array2,'strcasecmp')); // ['b' => 'brown']","classes":{"has":1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet">$array1 = ["a" => "green", "b" => "brown", "c" => "blue", "red"];
      $array2 = ["a" => "GREEN", "B" => "brown", "yellow", "red"];
      var_dump(array_intersect_uassoc($array1, $array2, 'strcasecmp')); // ['b' => 'brown']
    • array_intersect_ukey (array $array1 , array $array2 [, array $...], callable $key_compare_func ) : array — 用回呼函式比較鍵名來計算陣列的交集
       /"green/", /"b/" => /"brown/", /"c/" => /"blue/", /"red/"];/n$array2 = [/"a/" => /"GREEN/", /"B/" => /"brown/", /"yellow/", /"red/"];/nvar_dump(array_intersect_ukey($array1, $array2,'strcasecmp')); // ['a' => 'green', 'b' => 'brown', 'red']","classes":{"has":1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet">$array1 = ["a" => "green", "b" => "brown", "c" => "blue", "red"];
      $array2 = ["a" => "GREEN", "B" => "brown", "yellow", "red"];
      var_dump(array_intersect_ukey($array1, $array2, 'strcasecmp')); // ['a' => 'green', 'b' => 'brown', 'red']
    • array_intersect (array $array1 , array $array2 [, array $...] ) : array — 計算陣列的交集
      $a = ['a' => 'green', 'red', 'blue'];
      $b = ['b' => 'green', 'yellow', 'red'];
      var_dump(array_intersect($a, $b)); // ['a' => 'green', 'red']
    • array_merge_recursive ([array $...] ) : array — 遞回地合并一個或多個陣列
      $arr1 = ['color' => ['favorite' => 'red', 5]];
      $arr2 = ['color' => ['favorite' => 'green', 6, 7]];
      var_dump(array_merge_recursive($arr1, $arr2)); // ['color' => ['favorite' => ['red', 'green'], 5, 6, 7]]
    • array_merge (array $array1 [, array $...] ) : array — 合并一個或多個陣列
      $arr1 = ['color' => ['favorite' => 'red', 5]];
      $arr2 = ['color' => ['favorite' => 'green', 6, 7]];
      var_dump(array_merge($arr1, $arr2)); // ['color' => ['favorite' => 'green', 6, 7]];
      var_dump($arr1 + $arr2); // ['color' => ['favorite' => 'red', 5]]
    • array_udiff_assoc (array $array1 , array $array2 [, array $...], callable $value_compare_func ) : array — 帶索引檢查計算陣列的差集,用回呼函式比較資料
       /"a/", /"b/", /"c/"];/n$item2 = [-1 =>'a', -2 => 'b', -3 => 'c'];\n$item3 = [1 => ['a'], ['b'], ['c']];\nfunction compareKey($a, $b) {\n  if(abs($a) == abs($b)) return 0;\n  return (abs($a) > abs($b)) ? 1 : -1;\n}\nfunction compareValue($a, $b) {\n $tempA = is_array($a) ? $a[0] : $a;\n$tempB = is_array($b) ? $b[0] : $b;\nif($tempA == $tempB) return 0;\nreturn ($tempA > $tempB) ? 1 : -1;\n}\nprint_r(array_diff_uassoc($item1, $item2, 'compareKey')); // []\nprint_r(array_udiff_assoc($item1, $item2, 'compareKey')); // ['a', 'b', 'c']\nprint_r(array_diff_uassoc($item1, $item3, 'compareValue')); // ['a', 'b', 'c']\nprint_r(array_udiff_assoc($item1, $item3, 'compareValue')); // []","classes":{"has":1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet">// https://segmentfault.com/q/1010000000364758/a-1020000000364791 array_udiff_assoc 和 array_diff_uassoc 區別
      /**
      * https://www.reddit.com/r/PHP/comments/1ncqc0/real_difference_between_array_udiff_assoc_and/
      */
      $item1 = [ 1 => "a", "b", "c"];
      $item2 = [-1 => 'a', -2 => 'b', -3 => 'c'];
      $item3 = [1 => ['a'], ['b'], ['c']];
      function compareKey($a, $b) {
        if(abs($a) == abs($b)) return 0;
        return (abs($a) > abs($b)) ? 1 : -1;
      }
      function compareValue($a, $b) {
       $tempA = is_array($a) ? $a[0] : $a;
      $tempB = is_array($b) ? $b[0] : $b;
      if($tempA == $tempB) return 0;
      return ($tempA > $tempB) ? 1 : -1;
      }
      print_r(array_diff_uassoc($item1, $item2, 'compareKey')); // []
      print_r(array_udiff_assoc($item1, $item2, 'compareKey')); // ['a', 'b', 'c']
      print_r(array_diff_uassoc($item1, $item3, 'compareValue')); // ['a', 'b', 'c']
      print_r(array_udiff_assoc($item1, $item3, 'compareValue')); // []
    • array_udiff_uassoc (array $array1 , array $array2 [, array $...], callable $value_compare_func , callable $key_compare_func ) : array — 帶索引檢查計算陣列的差集,用回呼函式比較資料和索引
      $a = ['0.1' => 9, '0.5' => 12, 0 => 23, 1 => 4, 2 => -15];
      $b = ['0.2' => 9, '0.5' => 22, 0 => 3, 1 => 4, 2 => -15];
      function compareKey($a, $b) {
       if ($a === $b) return 0;
       return $a > $b ? 1 : -1;
      }
      function compareValue($a, $b) {
       if ($a === $b) return 0;
       return $a > $b ? 1 : -1;
      }
      print_r(array_udiff_uassoc($a, $b, 'compareValue', 'compareKey')); // [0.1 => 9, 0.5 => 12, 0 => 23]
    • array_udiff (array $array1 , array $array2 [, array $...], callable $value_compare_func ) : array — 用回呼函式比較資料來計算陣列的差集
       $areaB ? 1 : -1;\n}\nprint_r(array_udiff($a, $b,'compare')); // [[1, 2], [7, 1]]","classes":{"has":1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet">$a = [[1, 2], [7, 1], [2, 9]];
      $b = [[1, 3], [8, 1], [2, 9]];
      function compare($a, $b) {
       $areaA = $a[0] * $a[1];
       $areaB = $b[0] * $b[1];
       if ($areaA == $areaB) return 0;
       return $areaA > $areaB ? 1 : -1;
      }
      print_r(array_udiff($a, $b, 'compare')); // [[1, 2], [7, 1]]
    • array_uintersect_assoc (array $array1 , array $array2 [, array $...], callable $value_compare_func ) : array — 帶索引檢查計算陣列的交集,用回呼函式比較資料
      $a = ['a' => 'green', 'b' => 'brown', 'c' => 'blue', 'red'];
      $b = ['a' => 'GREEN', 'B' => 'brown', 'yellow', 'red'];
      print_r(array_uintersect_assoc($a, $b, 'strcasecmp')); // ['a' => 'green']
    • array_uintersect_uassoc (array $array1 , array $array2 [, array $...], callable $value_compare_func , callable $key_compare_func ) : array — 帶索引檢查計算陣列的交集,用單獨的回呼函式比較資料和索引
       /"green/", /"b/" => /"brown/", /"c/" => /"blue/", /"red/");/n$array2 = array(/"a/" => /"GREEN/", /"B/" => /"brown/", /"yellow/", /"red/");/nprint_r(array_uintersect_uassoc($array1, $array2, /"strcasecmp/", /"strcasecmp/")); // ['a' => 'green', 'b' => 'brown']","classes":{"has":1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet">$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
      $array2 = array("a" => "GREEN", "B" => "brown", "yellow", "red");
      print_r(array_uintersect_uassoc($array1, $array2, "strcasecmp", "strcasecmp")); // ['a' => 'green', 'b' => 'brown']
    • array_uintersect (array $array1 , array $array2 [, array $...], callable $value_compare_func ) : array — 計算陣列的交集,用回呼函式比較資料
       $areaB ? 1 : -1;\n}\nprint_r(array_uintersect($a, $b,'compare')); // [[2, 9]]","classes":{"has":1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet">$a = [[1, 2], [7, 1], [2, 9]];
      $b = [[1, 3], [8, 1], [2, 9]];
      function compare($a, $b) {
       $areaA = $a[0] * $a[1];
       $areaB = $b[0] * $b[1];
       if ($areaA == $areaB) return 0;
       return $areaA > $areaB ? 1 : -1;
      }
      print_r(array_uintersect($a, $b, 'compare')); // [[2, 9]]
  8. 陣列排序

    • array_multisort (array &$array1 [, mixed $array1_sort_order = SORT_ASC [, mixed $array1_sort_flags = SORT_REGULAR [, mixed $...]]] ) : bool — 對多個陣列或多維陣列進行排序
      // 更多用法請看 https://www.php.net/manual/en/function.array-multisort.php
      $ar1 = [10, 100, 100, 0];
      $ar2 = [1, 3, 2, 4];
      array_multisort($ar1, $ar2); // [0, 10, 100, 100] [4, 1, 2, 3]
      array_multisort($ar1, SORT_DESC, SORT_NUMERIC, $ar2, SORT_ASC, SORT_NUMERIC); // [100, 100, 10, 0] [2, 3, 1, 4]
    • arsort (array &$array [, int $sort_flags = SORT_REGULAR] ) : bool — 對陣列進行逆向排序并保持索引關系
       /"lemon/", /"a/" => /"orange/", /"b/" => /"banana/", /"c/" => /"apple/");/narsort($fruits);/nprint_r($fruits); // ['a' => 'orange', 'd' => 'lemon', 'b' => 'banana', 'c' => 'apple'];","classes":{"has":1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet">// 排序針對的是值, 而且會保存原先索引
      $fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
      arsort($fruits);
      print_r($fruits); // ['a' => 'orange', 'd' => 'lemon', 'b' => 'banana', 'c' => 'apple'];
    • asort (array &$array [, int $sort_flags = SORT_REGULAR] ) : bool — 對陣列進行排序并保持索引關系
       /"lemon/", /"a/" => /"orange/", /"b/" => /"banana/", /"c/" => /"apple/");/nasort($fruits);/nprint_r($fruits); // ['c' => 'apple', 'b' => 'banana', 'd' => 'lemon', 'a' => 'orange'];","classes":{"has":1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet">$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
      asort($fruits);
      print_r($fruits); // ['c' => 'apple', 'b' => 'banana', 'd' => 'lemon', 'a' => 'orange'];
    • krsort (array &$array [, int $sort_flags = SORT_REGULAR] ) : bool — 對陣列按照鍵名逆向排序
      $fruits = ['d' => 'lemon', 'a' => 'orange', 'b' => 'banana', 'c' => 'apple'];
      krsort($fruits);//true
      var_dump($fruits); // ['d' => 'lemon', 'c' => 'apple', 'b' => 'banana', 'a' => 'orange']
    • ksort (array &$array [, int $sort_flags = SORT_REGULAR] ) : bool — 對陣列按照鍵名排序
      $fruits = ['d' => 'lemon', 'a' => 'orange', 'b' => 'banana', 'c' => 'apple'];
      ksort($fruits);//true
      var_dump($fruits); // ['a' => 'orange', 'b' => 'banana', 'c' => 'apple', 'd' => 'lemon']
    • rsort (array &$array [, int $sort_flags = SORT_REGULAR] ) : bool — 對陣列逆向排序
      $fruits = array("lemon", "orange", "banana", "apple");
      rsort($fruits); // true
      var_dump($fruits); // ['orange', 'lemon', 'banana', 'apple']
    • sort (array &$array [, int $sort_flags = SORT_REGULAR] ) : bool — 對陣列排序
      // https://bettercuicui.github.io/2018/04/01/PHP/php%20sort%E6%8E%92%E5%BA%8F%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86/
      $fruits = array("lemon", "orange", "banana", "apple", 1);
      sort($fruits);
      var_dump($fruits); // ['apple', 'banana', 'lemon', 'orange', 1]
      // 數字比較專案, 'a1' 轉換數字為 0, 所以排序順序如下
      $arr1 = ['a1', 0, 2, '1a'];
      sort($arr1, SORT_NUMERIC);
      var_dump($arr1);  // ['a1', 0, '1a', 2]
      // 被作為字串來比較
      $fruits = array("lemon", "orange", "banana", "apple", 1);
      sort($fruits, SORT_STRING);
      var_dump($fruits); // [1, 'apple', 'banana', 'lemon', 'orange']
      // 根據當前的區域(locale)設定來把單元當作字串比較,可以用 setlocale() 來改變
      $fruits = array("lemon", "orange", "banana", "apple", 1);
      sort($fruits, SORT_LOCALE_STRING);
      var_dump($fruits); // [1, 'apple', 'banana', 'lemon', 'orange']
      //  和 natsort() 類似對每個單元以“自然的順序”對字串進行排序
      $arr = ['a1', 'A1', 'c2', 'c3', 'b4', 'b5', 'B1'];
      sort($arr, SORT_NATURAL);  // true
      var_dump($arr); // ['A1', 'B1', 'a1', 'b4', 'b5', 'c2', 'c3']
      // 能夠與 SORT_STRING 或 SORT_NATURAL 合并(OR 位運算),不區分大小寫排序字串,
      $fruits = array("lemon", "orange", "banana", "apple", "Apple", 1);
      sort($fruits, SORT_FLAG_CASE|SORT_STRING);
      var_dump($fruits); // [1, "apple", "Apple", "banana", "lemon", "orange"]
    • uasort (array &$array , callable $value_compare_func) : bool — 使用用戶自定義的比較函式對陣列中的值進行排序并保持索引關聯
      // 用戶自定義值比較函式, 保持索引不變
      function compare($a, $b) {
       if ($a === $b) {
           return 0;
       }
       return ($a < $b)  ? -1 : 1;
      }
      $arr = ['a' => 3, 'b' => 9, 'c' => 4, 'd' => 8, 'e' => -1];
      uasort($arr, 'compare'); // true
      var_dump($arr); // ['e' => -1, 'a' => 3, 'c' => 4, 'd' => 8, 'b' => 9]
    • uksort (array &$array , callable $key_compare_func) : bool — 使用用戶自定義的比較函式對陣列中的鍵名進行排序
       $b)  ? -1 : 1;\n}\n$arr = ['a' =&gt; 3, 'b' =&gt; 9, 'c' =&gt; 4, 'e' =&gt; 8, 'd' =&gt; -1];\nuksort($arr, 'compare'); // true\nvar_dump($arr); // ['a' =&gt; 3, 'b' =&gt; 9, 'c' =&gt; 4, 'd' =&gt; -1, 'e' =&gt; 8]&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet">// 用戶自定義值比較函式, 保持索引不變
      function keyCompare($a, $b) {
       if ($a === $b) {
           return 0;
       }
       return ($a > $b)  ? -1 : 1;
      }
      $arr = ['a' => 3, 'b' => 9, 'c' => 4, 'e' => 8, 'd' => -1];
      uksort($arr, 'compare'); // true
      var_dump($arr); // ['a' => 3, 'b' => 9, 'c' => 4, 'd' => -1, 'e' => 8]
    • usort (array &$array , callable $value_compare_func) : bool — 使用用戶自定義的比較函式對陣列中的值進行排序
      // 對多維陣列排序時,$ a和$ b包含對陣列第一個索引的參考,
      function cmp($a, $b)
      {
      return strcmp($a["fruit"], $b["fruit"]);
      }
      $fruits = [['fruit' => 'lemons'], ['fruit' => 'apples'], ['fruit' => 'grapes']];
      usort($fruits, "cmp");
      var_dump($arr); // [['fruit' => 'apples'], ['fruit' => 'grapes'], ['fruit' => 'lemons']]
    • natcasesort (array &$array) : bool — 用 “自然排序” 演算法對陣列進行不區分大小寫字母的排序
      // 自然排序, 以人們認知方式排序,不區分大小寫
      $arr = ['a1', 'A1', 'c2', 'c3', 'b4', 'b5', 'B1'];
      natcasesort($arr);  // true
      var_dump($arr); // ['a1', 'A1', 'B1', 'b4', 'b5', 'c2', 'c3']
    • natsort (array &$array) : bool — 用 “自然排序” 演算法對陣列排序
      // 自然排序, 以人們認知方式排序,區分大小寫
      $arr = ['a1', 'A1', 'c2', 'c3', 'b4', 'b5', 'B1'];
      natsort($arr);  // true
      var_dump($arr); // ['A1', 'B1', 'a1', 'b4', 'b5', 'c2', 'c3']
  9. 回呼函式處理陣列

    • array_filter (array $array [, callable $callback [, int $flag = 0]] ) : array — 用回呼函式過濾陣列中的單元
      // 若沒有回呼函式, 則篩選值為false
      $a = [1, 0, 'false', 'null', '0', 2, '', false];
      var_dump(array_filter($a)); // [1, "false", "null", 2]
      $b = [6, 7, 8, 9, 10, 11, 12];
      function odd($var)
      {
        return $var & 1;
      }
      var_dump(array_filter($b, 'odd')); // [7, 9, 11]
    • array_map (callable $callback , array $array1 [, array $...] ) : array — 為陣列的每個元素應用回呼函式
      print_r(array_map('strtoupper', ['a', 'b', 'c'])); // ['A', 'B', 'C']
      function demo($n, $m) {
        return strtoupper($n) . '-' . strtoupper($m);
      }
      print_r('demo', ['a', 'b', 'c'], ['d', 'e', 'f']); // ['A-D', 'B-E', 'C-F']
    • array_walk_recursive (array &$array , callable $callback [, mixed $userdata = https://www.cnblogs.com/a609251438/p/NULL] ) : bool — 對陣列中的每個成員遞回地應用用戶函式
      $sweet = ['a' => 'apple', 'b' => 'banana'];
      $fruits = ['sweet' => $sweet, 'sour' => 'lemon'];
      function testPrint($item, $key) {
        echo "$key holds $item\n";
      }
      /**
      * a holds apple
      * b holds banana
      * sour holds lemon
      */
      array_walk_recursive($fruits, 'testPrint');
      function testPrint2($item, $key, $userData) {
        $item = strtoupper($item);
        echo "$key holds $item and $userData\n";
      }
      /**
      * a holds apple and php
      * b holds banana and php
      * sour holds lemon and php
      */
      array_walk_recursive($fruits, 'testPrint2', 'php');
    • array_walk (array &$array , callable $callback [, mixed $userdata = https://www.cnblogs.com/a609251438/p/NULL] ) : bool — 使用用戶自定義函式對陣列中的每個元素做回呼處理
      $sweet = ['a' => 'apple', 'b' => 'banana'];
      function testPrint($item, $key) {
        echo "$key holds $item\n";
      }
      /**
      * a holds apple
      * b holds banana
      */
      array_walk($sweet, 'testPrint');
      function testPrint($item, $key, $userData) {
        echo "$key holds $item and $userData\n";
      }
      /**
      * a holds apple and php
      * b holds banana and php
      * sour holds lemon and php
      */
      array_walk_recursive($fruits, 'testPrint2', 'php');
  10. 陣列替換

    • array_replace_recursive (array $array1 [, array $...] ) : array — 使用傳遞的陣列遞回替換第一個陣列的元素
      $base = ['citrus' => ['orange'], 'berries' => ['blackberry', 'raspberry']];
      $replacements = ['citrus' => ['pineapple'], 'berries' => ['blueberry']];
      var_dump(array_replace_recursive($base, $replacements));// ['citrus' => ['pineapple'], 'berries' => ['blueberry', 'raspberry']]
    • array_replace (array $array1 [, array $...] ) : array — 使用傳遞的陣列替換第一個陣列的元素
      $base = ['citrus' => ['orange'], 'berries' => ['blackberry', 'raspberry']];
      $replacements = ['citrus' => ['pineapple'], 'berries' => ['blueberry']];
      var_dump(array_replace($base, $replacements));// ['citrus' => ['pineapple'], 'berries' => ['blueberry']]
    • array_splice (array & $input , int $offset [, int $length = count ($input) [, mixed $replacement = array () ]] ) : array — 去掉陣列中的某一部分并用其它值取代
      $a = ['a', 'b', 'c'];
      array_splice($a, 1, 2, ['B', 'C']);
      var_dump($a); // ['a', 'B', 'C']
      array_splice($a, -2, 2, ['b', 'c']); 
      var_dump($a);// ['a', 'b', 'c']
      array_splice($a, 3, 0, ['d', 'e']);
      var_dump($a); // ['a', 'b', 'c', 'd', 'e']
  11. 陣列指標操作

    • current (array $array) : mixed — 回傳陣列中的當前單元
      $a = [1, 2, 3];
      var_dump(current($a)); // 1
    • end (array &$array) : mixed — 將陣列的內部指標指向最后一個單元
      $a = [1, 2, 3];
      var_dump(end($a)); // 3
    • key (array $array) : mixed — 從關聯陣列中取得鍵名
      $arr = ['color' => 'red'];
      var_dump(key($arr)); // color
    • next (array &$array) : mixed — 將陣列中的內部指標向前移動一位
      $arr = [1, 2, 3];
      var_dump(next($arr)); // 2
    • pos — current 的別名
    • prev (array &$array) : mixed — 將陣列的內部指標倒回一位
      $arr = [1, 2, 3];
      next($arr); // 2
      var_dump(prev($arr)); // 1
    • reset (array &$array) : mixed — 將陣列的內部指標指向第一個單元
      $arr = [1, 2, 3];
      next($arr); // 2
      next($arr); // 3
      var_dump(reset($arr)); // 1
  12. 其他

    • array_column (array $input , mixed $column_key [, mixed $index_key = NULL] ) : array — 回傳陣列中指定的一列
      $a = [['id' => 1, 'first_name' => 'John', 'last_name' => 'Doe'], ['id' => 2, 'first_name' => 'Wythe', 'last_name' => 'Huang']];
      print_r(array_column($a, 'first_name')); // ['John', 'Wythe']
      print_r(array_column($a, 'first_name', 'id')); // [1=> 'John', 2 => 'Wythe']
    • array_flip (array $array) : array — 交換陣列中的鍵和值
      $a = ['a' => 1, 'b' => 2, 'c' => 3];
      var_dump(array_filp($a)); // [1 => 'a', 2 => 'b', 3 => 'c']
    • array_reverse (array $array [, bool $preserve_keys = FALSE] ) : array — 回傳單元順序相反的陣列
      $a = ['php', 4.0, ['green', 'red']];
      var_dump(array_reverse($a)); // [['green', 'red'], 7.1, 'php']
      var_dump(array_reverse($a, true)); // [2 => ['green', 'red'], 1 => 7.1, 0 => 'php']
    • array_unique (array $array [, int $sort_flags = SORT_STRING] ) : array — 移除陣列中重復的值
      $a = ['4', 1, 4, '1', 2];
      var_dump(array_unique($a)); // [0 => '4', 1 => 1, 4 => 2]
      var_dump(array_unique($a, SORT_NUMERIC));// [0 => '4', 1 => 1, 4 => 2]
    • count (mixed $array_or_countable [, int $mode = COUNT_NORMAL] ) : int — 計算陣列中的單元數目,或物件中的屬性個數
      $a = [1, 2, 3];
      echo count($a); // 3
      $b = [$a, 4, 5, 6];
      echo count($b, COUNT_RECURSIVE) // 7
    • extract (array &$array [, int $flags = EXTR_OVERWRITE [, string $prefix = NULL]] ) : int — 從陣列中將變數匯入到當前的符號表

      $size = 1;
      $varArray = ['color' => 'blue', 'size' => 2, 'shape' => 'sphere'];
      
      var_dump(extract($varArray)); // 3 若存在, 則覆寫
      echo "$color, $size, $shape\n"; // blue, 2, sphere
      
      extract($varArray, EXTR_SKIP); // 若存在, 則不覆寫
      echo "$color, $size, $shape\n"; // blue, 1, sphere
      
      extract($varArray, EXTR_PREFIX_SAME, 'prefix'); // 若存在, 則在變數名使用前綴
      echo "$color, $size, $shape, $prefix_size\n"; // blue, 1, sphere, 2
      
      extract($varArray, EXTR_PREFIX_ALL, 'prefix'); // 若存在, 則在變數名使用前綴
      echo "$prefix_color, $size, $prefix_shape, $prefix_size\n"; // blue, 1, sphere, 2
      
      var_dump(extract($varArray, EXTR_IF_EXISTS)); // 1 若存在, 則只覆寫已有變數
      /**
      * Notice: Undefined variable: color
      * Notice: Undefined variable: shape
      */
      echo "$color, $size, $shape\n"; // , 2, 
      
      extract($varArray, EXTR_PREFIX_IF_EXISTS, 'prefix'); // 僅當當前符號表中存在相同變數的非前綴版本時,才創建帶前綴的變數名稱,
      /**
      * Notice: Undefined variable: color
      * Notice: Undefined variable: shape
      */
      echo "$color, $size, $shape, $prefix_size\n"; // , 1, , 2
      
      var_dump(extract($varArray, EXTR_REFS)); // 3 變數作為參考,這實際上意味著匯入的變數的值仍在參考陣列引數的值, 可以與其他引數結合
      echo "$color, $size, $shape\n"; // blue, 2, sphere
      $color = 'red';
      var_dump($varArray); // ['color' => 'red', 'size' => 2, 'shape' => 'sphere'];
      
      // 變數作為參考,這實際上意味著匯入的變數的值仍在參考陣列引數的值, 可以與其他引數結合, 若決議變數前綴的, 則修改前綴變數, 陣列變數則修改.
      $size = 1;
      $varArray = ['color' => 'blue', 'size' => 2, 'shape' => 'sphere'];
      var_dump(extract($varArray, EXTR_REFS|EXTR_PREFIX_SAME, 'prefix')); // 3
      echo "$color, $size, $shape, $prefix_size\n"; // blue, 1, sphere, 2
      $color = 'red';
      $prefix_size = 4;
      var_dump($size); // 1
      var_dump($varArray); // ['color' => 'red', 'size' => 4, 'shape' => 'sphere'];
      
      $a = [1, 2, 3];
      extract($a, EXTR_PREFIX_INVALID, 'prefix');
      echo "$prefix_0, $prefix_1, $prefix_2\n"; // 1, 2, 3
    • list (mixed $var1 [, mixed $...] ) : array — 把陣列中的值賦給一組變數
      // 語言結構, 并非函式
      $info = ['coffee', 'brown', 'caffeine'];
      list($drink, $color, $power) = $info;
      echo "$drink, $color, $power"; // coffee, brown, caffeine
      // 可以省略不想取的
      list($drink, , $power) = $info;
      echo "$drink, $power"; // coffee, caffeine
      // 7.0 以上是從左到右賦值, 7.0以下是從右到左賦值
      list($a[0], $a[1], $a[2]) = $info;
      // 7.0 以上
      var_dump($a); // ['coffee', 'brown', 'caffeine']
      // 7.0 以下
      var_dump($a); // ['caffeine', 'brown', 'coffee']
      // 7.1 支持索引陣列
      $info = ['a' => 'coffee', 'b' => 'brown', 'c' => 'caffeine'];
      list('a' => $drink, 'c' => $power) = $info;
      echo "$drink, $power"; // coffee, caffeine
    • shuffle (array &$array) : bool — 打亂陣列
      $arr = [1, 2, 3, 4];
      shuffle($arr); // 洗牌演算法, 打亂陣列
    • sizeof 等同于 count
    • 很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那里入手去提升,對此我整理了一些資料,包括但不限于:分布式架構、高可擴展、高性能、高并發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階干貨需要的可以免費分享給大家,需要的加群(點擊→)677079770

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/108986.html

標籤:PHP

上一篇:php+redis實作注冊、洗掉、編輯、分頁、登錄、關注等功能

下一篇:[日常] 解決github速度特別慢

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more