About Aida Nana

Nghề chính là chém gió, quăng bom và ném lựu đạn.
Nghề phụ là cắt cỏ, chém chuối, cưa cây......

Map (ánh xạ) trong C++

Map là một loại associative container. Mỗi phần tử của map là sự kết hợp của khóa (key value) và ánh xạ của nó (mapped value). Cũng giống như set, trong map không chứa các khóa mang giá trị giống nhau.

Trong map, các khóa được sử dụng để xác định giá trị các phần tử. Kiểu của khóa và ánh xạ có thể khác nhau.

Và cũng giống như set, các phần tử trong map được sắp xếp theo một trình tự nào đó theo cách so sánh.

Map được cài đặt bằng red-black tree (cây đỏ đen) – một loại cây tìm kiếm nhị phân tự cân bằng. Mỗi phần tử của map lại được cài đặt theo kiểu pair (xem thêm ở thư viện utility).

Khai báo: 

#include <map>

map <kiểu_dữ_liệu_1,kiểu_dữ_liệu_2>

// kiểu dữ liệu 1 là khóa, kiểu dữ liệu 2 là giá trị của khóa.

 

Sử dụng class so sánh:

Dạng 1:

struct cmp{

bool operator() (char a,char b) {return a<b;}

};

.....

map <char,int,cmp> m;
  • Truy cập đến giá trị của các phần tử trong map khi sử dụng iterator: Ví dụ ta đang có một iterator là it khai báo cho map thì:
  • (*it).first;   // Lấy giá trị của khóa, kiểu_dữ_liệu_1
    
    (*it).second;  // Lấy giá trị của giá trị của khóa, kiểu_dữ_liệu_2
    
    (*it)          // Lấy giá trị của phần tử mà iterator đang trỏ đến, kiểu pair
    
    it->first;  // giống như (*it).first
    
    it->second; // giống như (*it).second
    
    

    Capacity:

    • size : trả về kích thước hiện tại của map. ĐPT O(1)
    • empty : true nếu map rỗng, và ngược lại. ĐPT O(1).

     

    Truy cập tới phần tử:

    • operator [khóa]: Nếu khóa đã có trong map, thì hàm này sẽ trả về giá trị mà khóa ánh xạ đến. Ngược lại, nếu khóa chưa có trong map, thì khi gọi [] nó sẽ thêm vào map khóa đó. ĐPT O(logN)

    Chỉnh sửa

    • insert : Chèn phần tử vào map. Chú ý: phần tử chèn vào phải ở kiểu “pair”. ĐPT O(logN).
    • erase :

    o xóa theo iterator ĐPT O(logN)

      1. xóa theo khóa: xóa khóa trong map. ĐPT: O(logN).
    • clear : xóa tất cả set. ĐPT O(n).
    • swap : đổi 2 set cho nhau. ĐPT O(n).

    Operations:

    • find : trả về itarator trỏ đến phần tử cần tìm kiếm. Nếu không tìm thấy iterator trỏ về “end” của map. ĐPT O(logN).
    • lower_bound : trả về iterator đến vị trí phần tử bé nhất mà không bé hơn (lớn hơn hoặc bằng) khóa (dĩ nhiên là theo phép so sánh), nếu không tìm thấy trả về vị trí “end” của map. ĐPT O(logN).
    • upper_bound: trả về iterator đến vị trí phần tử bé nhất mà lớn hơn khóa, nếu không tìm thấy trả về vị trí “end” của map. ĐPT O(logN).
    • count : trả về số lần xuất hiện của khóa trong multiset. ĐPT O(logN)

    Chương trình demo:

    #include <iostream>
    
    #include <map>
    
    #include <vector>
    
    using namespace std;
    
    main() {
    
        map <char,int> m;
    
        map <char,int> :: iterator it;
    
        m['a']=1;
        m.insert(make_pair('b',2));
        m.insert(pair<char,int>('c',3) );
    
        // m={{'a',1}}
        // m={{'a',1};{'b',2}}
        // m={{'a',1};{'b',2};{'c',3}}
    
        cout << m['b'] << endl; m['b']++;     // In ra 2
    
        // m={{'a',1};{'b',3};{'c',3}}
    
        it=m.find('c');    // it trỏ tới phần tử khóa 'c'
    
        cout << it->first << endl; 
        cout << it->second << endl;
        // In ra 'c'
        // In ra 3
    
        m['e']=100;
        //m={{'a',1};{'b',3};{'c',3};{'e',100}}
    
        it=m.lower_bound('d'); 
        cout << it->first << endl; 
        cout << it->second << endl;
        // it tỏ tới phần tử khóa 'e'
        // In ra 'e'
        // In ra 100
        system("pause");
    }
    

Mutiset (tập hợp) trong C++

Multiset giống như Set nhưng có thể chứa các khóa có giá trị giống nhau.

Đọc thêm về Set tại: https://yeulaptrinh.pw/938/set-trong-c/

Khai báo : giống như set.

Các hàm thành viên:

Capacity:

  • size : trả về kích thước hiện tại của multiset. ĐPT O(1)
  • empty : true nếu multiset rỗng, và ngược lại. ĐPT O(1).

Chỉnh sửa:

  • insert : Chèn phần tử vào set. ĐPT O(logN).
  • erase :
    • xóa theo iterator ĐPT O(logN)
    • xóa theo khóa: xóa tất cả các phần tử bằng khóa trong multiset. ĐPT: O(logN) + số phần tử bị xóa.
  • clear : xóa tất cả set. ĐPT O(n).
  • swap : đổi 2 set cho nhau. ĐPT O(n).

Operations:

  • find : trả về itarator trỏ đến phần tử cần tìm kiếm. Nếu không tìm thấy itarator trỏ về “end” của set. ĐPT O(logN). Dù trong multiset có nhiều phần tử bằng khóa thì nó cũng chỉ iterator đến một phần tử.
  • lower_bound : trả về iterator đến vị trí phần tử bé nhất mà không bé hơn (lớn hơn hoặc bằng) khóa (dĩ nhiên là theo phép so sánh), nếu không tìm thấy trả về vị trí “end” của set. ĐPT O(logN).
  • upper_bound: trả về iterator đến vị trí phần tử bé nhất mà lớn hơn khóa, nếu không tìm thấy trả về vị trí “end” của set.. ĐPT O(logN).
  • count : trả về số lần xuất hiện của khóa trong multiset. ĐPT O(logN) + số phần tử tìm được.

Chương trình Demo:

#include <iostream>

#include <set>

using namespace std;

main() {
    multiset <int> s;

    multiset <int> :: iterator it;

    int i;

    for (i=1;i<=5;i++) s.insert(i*10); // s={10,20,30,40,50}
    s.insert(30);    // s={10,20,30,30,40,50}
    cout << s.count(30) << endl;    // In ra 2
    cout << s.count(20) << endl;    // In ra 1
    s.erase(30);    // s={10,20,40,50}

    /* Duyet set */
    for (it=s.begin();it!=s.end();it++) {
    cout << *it <<  " ";
    }

    //In ra 10 20 40 50 
    cout << endl; system("pause");
}

Priority queue (hàng đợi ưu tiên) trong C++

Priority queue là một loại container adaptor, được thiết kế đặc biệt để phần tử ở đầu luôn luôn lớn nhất (theo một quy ước về độ ưu tiên nào đó) so với các phần tử khác.

Nó giống như một heap, mà ở đây là heap max, tức là phần tử có độ ưu tiên lớn nhất có thể được lấy ra và các phần tử khác được chèn vào bất kì.

Phép toán so sánh mặc định khi sử dụng priority queue là phép toán less (Xem thêm ở thư viện functional)

Để sử dụng priority queue một cách hiệu quả, các bạn nên học cách viết hàm so sánh để sử dụng cho linh hoạt cho từng bài toán.

Khai báo: #include <queue>

/*Dạng 1 (sử dụng phép toán mặc định là less)*/ 
priority_queue <int> pq;

/* Dạng 2 (sử dụng phép toán khác) */
priority_queue <int,vector<int>,greater<int> > q; //phép toán greater

Phép toán khác cũng có thể do người dùng tự định nghĩa. Ví dụ:

Cách khai báo ở dạng 1 tương đương với:

/* Dạng sử dụng class so sánh tự định nghĩa */ struct cmp{

bool operator() (int a,int b) {return a<b;}

};

main() {

…

priority_queue <int,vector<int>,cmp > q;

}

Các hàm thành viên:

  • size : trả về kích thước hiện tại của priority queue. ĐPT O(1)
  • empty : true nếu priority queue rỗng, và ngược lại. ĐPT O(1).
  • push : đẩy vào priority queue. ĐPT O(logN).
  • pop: loại bỏ phần tử ở đỉnh priority queue. ĐPT O(logN).
  • top : trả về phần tử ở đỉnh priority queue. ĐPT O(1).

Chương trình demo:

#include <iostream>
 
#include <queue>
 
#include <vector>
 
using namespace std;
 
main() {
 
    priority_queue <int> p;	// p={}
 
    p.push(1);	// p={1}
 
    p.push(5);	// p={1,5}
 
    cout << p.top() << endl; // In ra 5
 
    p.pop();	// p={1}
 
    cout << p.top() << endl; // In ra 1
 
    p.push(9);	// p={1,9}
 
    cout << p.top() << endl; // In ra 9
 
    system("pause");
 
}

Chương trình Demo 2:

#include <iostream>
 
#include <queue>
 
#include <vector>
 
using namespace std;
 
main() {
    priority_queue < int , vector <int> , greater <int> > p;	// p={}
    p.push(1);     //p={1}
    p.push(5);     //p={1,5}
    cout << p.top() << endl;    //In ra 1
    p.pop();       //p={5}
    cout << p.top() << endl;     //In ra 5
    p.push(9);    //p={5,9}
    cout << p.top() << endl; // In ra 5
    system("pause");
}

Chương trình Demo 3:

#include <iostream>
 
#include <queue>
 
#include <vector>
 
using namespace std;
 
struct cmp{
    bool operator() (int a,int b) {return a<b;}
};
 
main() {
    priority_queue < int , vector <int> , cmp > p;	// p={}
    p.push(1);    //p={1}
    p.push(5);    //p={1,5}
    cout << p.top() << endl;     //In ra 1
    p.pop();    //p={5}
    cout << p.top() << endl;     //In ra 5
    p.push(9);    //p={5,9}
    cout << p.top() << endl; // In ra 5
system("pause");
}

Giới thiệu về Deep Learning

Thời gian gần đây, AI – Artificial Intelligence (Trí Tuệ Nhân Tạo) nổi lên như một thế lực đang làm thay đổi thế giới. Nào là chuyện VTV nói ra rả về công nghệ 4.0, rồi các báo giật tít về chuyện Facebook phải tắt AI do sợ chúng tạo ra ngôn ngữ riêng. Mới đầu nghe cụm từ Trí tuệ nhân tạo thì có vẻ rất ngầu, hay xuất hiện trong các phim bom tấn của Hollywood như anh chàng Javit của Iron-man hay lũ Ultron định xâm chiến trái đất… Tuy nhiên trí tuệ nhân tạo trong thực tế đang được sử dụng khá rộng rãi và có thể là hàng ngày, hàng giờ bạn đang dùng những ứng dụng như thế. Hệ thống tự tag khuôn mặt trong ảnh của Facebook, trợ lý ảo Siri – Cortana – Google now, google dịch…  chính là một vài sản phẩm của AI/Machine Learning/Deep Learning.

Cuối năm 2017, trí tuệ nhân tạo có bước phát triển mới khi mà một game thủ Dota 2 hàng đầu thế giới bị hạ gục bởi một trí tuệ nhân tạo. Điều này cho thấy trí tuệ nhân tạo có tiềm năng vô cùng lớn và có thể giỏi hơn con người trong một vài lĩnh vực.

OpenAI’s Dota 2 bot đã hạ gục game thủ nổi tiếng nhất thế giới trong trận chiến 1 vs 1 tại chung kết Dota 2 thế giới 2017.

Nguồn gốc trí tuệ của chú bot này chính là Deep Learning. Trong bài viết này tôi sẽ trình bày một vài kiến thức cơ bản về Trí tuệ nhân tạo/Machine Learning, đặc biệt là Deep Learning mà tôi biết. Đầu tiên các bạn hãy xem gia phả của Deep Learning nhé.

Artificial Intelligence

Trí tuệ nhân tạo nghiên cứu về các tác tử thông minh (intelligence agents) có khả năng nhận thức thế giới xung quanh, lập kế hoạch và đưa ra quyết định để đạt được mục tiêu của nó.

Hiểu một cách đơn giản hơn thì trí tuệ nhân tạo là trí tuệ được thể hiện trên các hệ thống nhân tạo. Một chiếc ô tô tự chạy không cần tài xế điều khiển, một trợ lý ảo có trả lời các câu hỏi của bạn… đó đều là những sản phẩm có trí tuệ do con người tạo nên. Người ta tạo ra AI nhằm trợ giúp hoặc thay thế con người trong một lĩnh vực nào đó. Ví dụ như:

  • Google đã và đang ứng dụng AI vào lĩnh vực xe tự hành;
  • Facebook sử dụng trí tuệ nhân tạo trong việc nhận diện hình ảnh;
  • Microsoft đang theo đuổi dự án điều trị ung thư bằng trí trí tuệ nhân tạo;
  • Google ứng dụng AI trong việc nhận diện giọng nói…

Trí tuệ nhân tạo gồm nhiều lĩnh vực con, chẳng hạn như thị giác máy tính, robot, machine learning, và xử lý ngôn ngữ tự nhiên…

Machine Learning

Machine Learning là một lĩnh vực của trí tuệ nhân tạo. Theo định nghĩa của Wikipedia, Machine learning is the subfield of computer science that “gives computers the ability to learn without being explicitly programmed”. Machine Learning là một lĩnh vực nhỏ của Khoa Học Máy Tính, nó có khả năng tự học hỏi dựa trên dữ liệu đưa vào mà không cần phải được lập trình cụ thể.

Bạn đưa cho Machine Learning rất nhiều dữ liệu – 5000 ảnh chó mèo và mong muốn chương trình của bạn thể đoán 1 bức ảnh chưa gặp bao giờ là chó hay mèo. Mỗi lần xem qua một ảnh, Machine Learning sẽ cố “ghi nhớ” đặc trưng của con chó hoặc con mèo: màu lông, vóc dáng, kích thước… Không chỉ dừng lại ở ghi nhớ, Machine Learning phải có khả năng tổng quát hóa những ảnh nó đã xem để có thể dự đoán cho những bức ảnh chưa bao giờ thấy.

Khả năng tổng quát là một khả năng tự nhiên và kì diệu của con người: bạn không thể nhìn thấy tất cả các khuôn mặt người trên thế giới nhưng bạn có thể nhận biết được một thứ có phải là khuôn mặt người hay không với xác suất đúng gần như tuyệt đối. Đỉnh cao của machine learning sẽ là mô phỏng được khả năng tổng quát hóa và suy luận này của con người. – anh Nguyễn Xuân Khánh (Machine Learning là gì?)

Bạn có thể tìm hiểu thêm về các kiến thức, thuật toán Machine Learning tại Blog Machine Learning cơ bản của anh Vũ Hữu Tiệp. Đây là nguồn kiến thức bằng tiếng Việt rất hữu ích với các bạn có ý định tìm hiểu sâu hơn về Machine Learning/Deep Learning.

Deep Learning

Deep Learning là một kỹ thuật trong Machine Learning, liên quan đến các thuật toán lấy cảm hứng từ cấu trúc và hoạt động của bộ não động vật gọi là Mạng nơ-ron nhân tạo (artificial neural networks).

Theo Wikipedia, An ANN is based on a collection of connected units or nodes called artificial neurons (analogous to biological neurons in an animal brain). Each connection (analogous to a synapse) between artificial neurons can transmit a signal from one to another. The artificial neuron that receives the signal can process it and then signal artificial neurons connected to it. Mạng nơ-ron nhân tạo được tạo nên từ một tập hợp các nơ-ron nhân tạo (tương tự nơ-ron sinh học trong não động vật) liên kết với nhau. Mỗi liên kết (tương tự một xi-náp) giữa các nơ-ron nhân tạo có thể truyền tín hiệu từ một nơ-ron đến các nơ-ron khác. Nơ-ron nhân tạo nhận tín hiệu, xử lý rồi laị truyền tín hiệu đã qua xử lý đến các nơ-ron mà nó liên kết.

Mạng nơ-ron nhân tạo có 3 lớp: input, hidden, output.

Cái gì Deep trong Deep Learning?

Các mạng nơ-ron nhân tạo truyền thống có rất ít lớp, hầu hết chỉ là 2 lớp. Cấu trúc như vậy không thích hợp với việc tính toán trên các mạng lớn hơn. Vì vậy các mạng có nhiều hơn 10 hoặc thậm chí đến 100 lớp được sử dụng. Trong Deep Learning thì mạng nơ-ron nhân tạo được chia ra thành rất nhiều lớp tạo ra một mạng nơ-ron sâu và lớn.

Tại sao vài năm nay Deep Learning mới trở thành hot trend?

Ý tưởng về mạng nơ-ron nhân tạo xuất hiện từ rất sớm, những năm 50 thế kỷ trước. Nhưng việc tạo ra những mạng nơ-ron hoạt động hiệu quả là không hề dễ dàng, nhìn chung, mạng nơ-ron sẽ cho kết quả tốt hơn khi:

  • Nhiều dữ liệu đầu vào hơn +
  • Mạng lớn hơn +
  • Khả năng tính toán của máy tính tốt hơn

Results Get Better With More Data, Larger Models, More Compute
Slide by Jeff Dean, All Rights Reserved.

Khả năng tính toán của máy tính ngày càng mạnh mẽ hay việc sử dụng các thuật toán tối ưu hơn trong Deep Learning đã góp phần vào thành công của Deep Learning như ngày nay. Bên cạnh đó là nguồn dữ liệu khổng lồ mà chúng ta có thể thu thập được dựa vào sự bùng nổ internet. Facebook có thể dễ dàng có được các bức ảnh chụp khuôn mặt của bạn từ đó tạo nên hệ thống tự động tag ảnh, hay Google biết mỗi ngày bạn tìm kiếm thứ gì, xem gì trên youtube, từ đó gợi ý cho bạn các quảng cáo hay video thú vị… Mà Deep Learning lại chính là “con quái vật” lớn lên từ những núi dữ liệu, khi chúng ta có rất nhiều dữ liệu thì Deep Learning có hiệu quả hơn hẳn các thuật toán khác.

Mảng (array) trong PHP

  1. Array là gì ?
  • Mảng là một biến đặc biệt và có thể lưu trữ nhiều giá trị.
  • Một biến thông thường chỉ chứa một giá trị duy nhất, nếu chúng ta muốn chứa nhiều giá trị trong một biến thì biến đó phải là một mảng (ví dụng cần lưu trữ thông tin của 1000 nhân viên).
  • Trong PHP có 3 loại mảng: mảng số nguyên, mảng kết hợp và mảng đa chiều.
  1. Khai báo và sử dụng mảng số nguyên
  • Mảng số nguyên là mảng mà các chỉ số của các phần tử phải thuộc kiểu số nguyên (mảng số nguyên còn được gọi là mảng liên tục)
  • Tìm hiểu cách truy cập các phần tử của mảng và in mảng.
  1. Khai báo và sử dụng mảng kết hợp:
  • Mảng kết hợp là các chỉ số của các phần tử có thể là chuỗi hoặc số (Mảng kết hợp còn gọi là không liên tục)
  • In danh sách các phần tử trong mảng kết hợp: foreach
  1. Khai báo và sử dụng mảng đa chiều
  • Mảng đa chiều là mảng mà mỗi phần tử trong mảng chính có thể là một mảng và mỗi phần tử trong mảng con lại cũng có thể là một mảng (mảng đa chiều còn gọi là mảng lồng)
  • In phần tử, in sách các phần tử trong mảng đa chiều: foreach
  1. Lấy danh sách các khóa và danh sách các giá trị của một mảng nào đó ?
  • array_value ($array) trả về một mảng liên túc có các phần tử có giá trị là giá trị lấy từ các phần tử của mảng $array.
  • array_keys ($array): trả về một mảng liên tục có các phần tử có giá trị là khóa lấy các phần tử của mảng $array.
  1. Loại bỏ phần tử ở đầu và cuối mảng
  • array_pop ($array) loại bỏ phần tử cuối cùng của mảng. Hàm trả về phần tử cuối cùng đã được loại bỏ.
  • array_shift ($array) loại bỏ phần tử đầu tiên của mảng. Hàm trả về phần tử đầu tiên đã được loại bỏ.
  1. Loại bỏ phần tử trùng nhau trong mảng
  • array_unique ($array) loại bỏ những phần tử trùng nhau trong mảng và trả về mảng mới.
  1. Xóa phần tử ở vị trí bất kì của mảng
  • Sử dụng hàm unset để xóa bỏ phần tử ở vị trí bất kỳ trong mảng.
  1. Thêm một hoặc nhiều phần tử ở đầu hoặc cuối mảng ?
  • array_push ($array, $val1, $val2, … , $valn) thêm một hoặc nhiều phần từ vào cuối mảng $array. Hàm trả về kiểu nguyên là số lượng của mảng $array mới.
  • array_unshift ($array, $val1, $val2, … , $valn) thêm một hoặc nhiều phần tử vào đầu mảng $array. Hàm trả về kiểu số nguyên là số lượng phần tử của mảng $array mới.
  1. Đảo ngược vị trí các phần tử của mảng
  • array_reverse ($array) đảo ngược vị trí các phần tử của mảng, phần tử cuối trở thành phần tử đầu tiên, phần tử ké cuối trở thành phần tử thứ nhì, … kết quả trả về là một mảng mới.
  1. Hoán đổi chỉ số và giá trị của mảng (đảo $key và $value)
  • Sử dụng hàm array_flip ($array) trả về một mảng có khóa và giá trị được hoán đổi cho nhau so với mảng $array (giá trị thành khóa và khóa thành giá trị)
  1. Xác định tổng, giá tri lớn nhất và giá trị nhỏ nhất trong mảng
  • Tính tổng các phần tử trong mảng array_sum ($array)
  • Xác định phần tử nhỏ nhất trong mảng min($array)
  • Xác định phần tử lớn nhất trong mảng max($array)
  1. Thống kê số lần xuất hiện của các phần tử trong mảng
  • Để thống kê sự xuất hiện của các phần tử trong mảng chúng ta sử dụng hàm array_count_values ($array)
  1. Kết hợp các mảng lại với nhau
  • array_merge ($array1, $array2, … , $arrayn) nhạp 2 hay nhiều mảng thành một mảng duy nhất và trả về mảng mới.
  1. Lấy ngẫu nhiên chỉ số ($key) của một mảng nào đó
  • array_rand ($array, $number) lấy ngẫu nhiên $number phần tử mảng $array và đưa vào mảng mới (láy giá trị khóa).
  1. Tìm kiếm phần tử trong mảng
  • array_search ($value, $array) tìm phần tử mang giá trị $value trong mảng $array. Trả về khóa của phần tử tìm được.
  1. Kiểm tra một $key hoặc $value nào đó có tồn tại trong mảng hay không ?
  • array_key_exists ($key, $array) kiểm tra khóa $key có tồn tại trong mảng $array hay không ? Nếu có trả về giá trị true.
  • in_array ($value, $array) kiểm tra giá trị $value có tồn tại trong mảng $array hay không ? Nếu có trả về giá trị true.
  1. Chuyển đổi các key trong mảng thành chữ hoa hoặc chữ thường
  • Sử dụng hàm array_change_key_case ($array, case) để chuyển đổi các chỉ số ($key) trong mảng thành chữ hoa hoặc chữ thường, tuy thuộc vào tham số case truyền vào. Kết quả trả về của hàm sẽ là một mảng mới.
  1. Chuyển đổi qua lại giữa mảng và chuỗi
  • implode ($str, $array) chuyển các giá trị của mảng $array thành một chuỗi bao gồm các phần tử các nhau bởi ký tự $str
  • explode ($delimiter, $str) chuyển một chuỗi thành một mảng. Tách chuỗi dựa vào $delimiter, mỗi đoạn tách ra sẽ thành một phần tử của mảng mới.
  1. Truy xuất phần tử của mảng với end, current, next và previous.
  • current($array) truy xuất phần tử hiện tại của mảng.
  • end($array) truy xuất phần tử cuối cùng của mảng.
  • next($array) truy xuất phần tử sau phần từ của mảng.
  • prev($array) truy xuất phần tử trước phần tử hiện tại của mảng.
  • reset() quay về vị trí phần tử đầu tiên trong mảng.
  1. Chuyển đổi mảng về một chuỗi đặc biệt và ngược lại
  • serialize ($value) chuyển chuỗi/mảng/đối tượng $value thành một chuỗi đặc biệt để lưu vào cơ sở dữ liệu.
  • unserialize($value) chuyển chuỗi đặc biệt được tạo từ serialize($value) về trạng thái ban đầu.
  1. Xáo trộn thứ tự các phần tử trong mảng
  • Sử dụng hàm shuffle để tạo ra mảng mới (mảng liên tục) với thứ tự các phần tử trong mảng bị thay đổi.
  1. Tạo mảng từ các biến có sẵn
  • Sử dụng hàm compact() để tạo ra mảng từ các biến có sẵn.
  1. Tạo mảng sử dụng hàm range()
  • Sử dụng hàm range để tạo ra các phần tử của mảng.
  1. Tạo mảng bằng cách sử dụng hàm array_combine
  • Sử dụng hàm array_combine($key, $value) để tạo một mảng mới có khóa được lấy từ mảng $key và giá trị được lấy từ mảng $value theo tuần tự.
  1. Các trường hợp so sánh giữa hai mảng
  • Trường hợp 1: So sánh khác nhau:
    • array_diff ($array1, $array2) trả về một mảng bao gồm các phần tử có giá trị tồn tại trong mảng $array1 nhưng không tồn tại trong mảng $array2
    • array_diff_key ($array1, $array2) trả về một mảng bao gồm các phần tử có khóa tồn tại trong mảng $array1 nhưng không tồn tại trong mảng $array2
    • array_diff_assoc ($array1, $array2) tả về một mảng bao gồm các phần tử có khóa và giá trị tồn tại trong mảng $array1 nhưng không tồn tại trong mảng $array2
  • Trường hợp 2: So sánh giống nhau:
    • array_intersect ($array1, $array2) trả về một mảng bao gồm các phần tử giống nhau về giá trị 2 mảng $array1 và $array2
    • array_intersect_key ($array1, $array2) trả về một mảng bao gồm các phần tử giống nhau về khóa giữa 2 mảng $array1 và $array2
    • array_intersect_assco ($array1, $array2) trả về một mảng bao gồm các phần tử giống nhau về khóa và giá trị giữa 2 mảng $array1 và $array2
  1. Xử lý giá trị các phần tử của mảng
  • Hàm array_walk sẽ gửi các giá trị của mảng đến một hàm nào đó để xử lý và nhận kết quả về là một mảng mới.
  1. Tìm hiểu hàm array_map
  • Hàm array_map sẽ gửi các giá trị của một hay nhiều mảng đến hàm nào đó đẻ xử lý và nhận kết quả trả về là một mảng mới.
  1. Trích xuất một đoạn phần tử của mảng
  • Hàm array_slice (array, offset, length, preserve) trích xuất lấy một đoạn phần tử của mảng từ vị trí bắt đầu offset (vị trí bắt đầu trong mảng là 0) và lấy length phần từ.
  1. Thay thế một đoạn phần tử của mảng
  • Hàm array_splice (array1, offset, length, array2) xóa bỏ một đoạn phần tử của mảng array1 từ vị trí offset và lấy length phần tử. Sau đó thay thế các phần tử bị loại bỏ bằng mảng array2
  1. Các trường hợp sắp xếp mảng
  • Sắp xếp theo giá trị:
    • sort(array) sắp xếp các phần tử trong mảng array tăng dần theo giá trị.
    • rsort(array) sắp xếp các phần tự trong mảng array giảm dần theo giá trị.
  • Sắp xếp theo khóa
    • ksort(array) sắp xếp các phần tử trong mảng array tăng dần theo khóa.
    • krsort(array) sắp xếp các phần tử trong mảng array giảm dần theo khóa.

Thao tác nâng cao trên mảng

 

  • Mảng là một biến đặc biệt và có thể lưu trữ nhiều giá trị (còn biến thì không). Trong PHP có 3 loại mảng: mảng số nguyên, mảng kết hợp và mảng đa chiều.
Mảng số nguyên Mảng kết hợp Mảng đa chiều
Tên gọi khác Mảng liên tục Mảng không liên tục Mảng lồng
Đặc điểm Chỉ số của mảng là số Chỉ số của mảng là chuỗi hoặc số Mỗi phần tử trong mảng chính là có thể là một mảng và mỗi phần tử trong mảng con cũng có thể là một mảng
In mảng Câu lệnh for Câu lệnh foreach

 

  1. Các hàm sử lý mảng:
STT Hàm Chức năng
1 print_r ($array) Xem cấu trúc mảng
2 count ($array) Trả về giá trị kiểu số nguyên là phần tử của mảng, hay là đếm số phần tử trong mảng. Có thể sử dụng hàm sizeof ($array)
3 array_values ($array) Trả về một mảng liên tục có các phần tử có giá trị là giá trị lấy từ các phần tử của mảng $array
4 array_keys ($array) Trả về một mảng liên tục có các phần tử có giá trị là khóa lấy từ các phần tử của mảng $array
5 array_pop ($array) Loại bỏ phần tử cuối của mảng. Hàm trả về phần tử cuối đã được loại bỏ.
6 array_shift ($array) Loại bỏ phần tử đầu tiên của mảng. Hàm trả về phần tử đầu tiên đã được loại bỏ.
7 array_unique ($array) Loại bỏ những phần tử trùng nhau trong mảng và trả về mảng mới
8 unset () Xóa phần tử ở vị trí bất kì của mảng
9 array_push ($array, $val1, $val2, … , $valn) Thêm một hoặc nhiều phần tử vào cuối mảng $array. Hàm trả về kiểu số nguyên là số lượng phần tử của mảng $array mới
10 array_unshift ($array, $val1, $val2, … , $valn) Thêm một hoặc nhiều phần tử vào đầu mảng $array. Hàm trả về kiểu số nguyên là số lượng phần tử của mảng $array mới
11 array_reverse ($array) Đảo ngược vị trị các phần tử của mảng, phần tử cuối trở thành phần tử đầu tiên, phần tử kế cuối trở thành phần tử thứ nhì, … kết quả trả về là một mảng mới.
12 array_flip ($array) Trả về một mảng có khóa và giá trị được hoán đổi cho nhau so với $array (giá trị thành khóa và khóa thành giá trị)
13 array_sum ($array) Tính tổng các phần tử trong mảng
14 min ($array) Xác định phần tử nhỏ nhất trong mảng.
15 max ($array) Xác định phần tử lớn nhất trong mảng.
16 array_count_values ($array) Thống kê số lần xuất hiện của các phần tử trong mảng.
17 array_merge ($array1, $array2, … , $arrayn) Nhập 2 hay nhiều mảng thành một mảng duy nhất và trả về mảng mới
18 array_rand ($array, $number) Lấy ngẫu nhiên $number phần tử mảng $array và đưa vào mảng mới (lấy giá trị khóa)
19 array_search ($value, $array) Tìm phần tử mang giá trị $value trong mảng $array. Trả về khóa của phần tử tìm được
20 array_key_exists ($key, $array) Kiểm tra khóa $key có tồn tại trong mảng $array hay không ? Nếu có trả về giá trị true
21 in_array ($value, $array) Kiểm tra giá trị $value có tồn tại trong mảng $array hay không ? Nếu có trả về true
22 array_slice ($array, $begin, $finish) Trích lấy một đoạn phần tử của mảng $array từ vị trí $begin đến vị trí $finish. Phần tử đầu tiên (chỉ số 0), phần tử cuối cùng (chỉ số -1 hay count($array)-1)
23 array_change_key_case ($array, case) Chuyển đổi các key trong mảng thành chữ hoa hoặc chữ thường
24 implode ($str, $array) Chuyển đổi giá trị của mảng $array thành một chuỗi bao gồm các phần tử cách nhau bởi ký tựu $str
25 explode ($delimiter, $str) Chuyển một chuỗi thành một mảng. Tách chuỗi dựa vào $delimiter, mỗi đoạn tách ra sẽ thành một phần tử của mảng mới.
26 current($array) Truy xuất phần tử hiện tại của mảng
27 end($array) Truy xuất phần tử cuối cùng của mảng
28 next($array) Truy xuất phần  tử sau phần tử hiện tại của mảng
29 prev($array) Truy xuất phần tử trước phần tử hiên tại của mảng
30 reset() Quay về vị trí phần tử đầu tiên trong mảng
31 serialize ($value) Chuyển chuỗi/mảng/đối tượng $value thành một chuỗi đặc biệt để lưu vào cơ sở dữ liệu
32 unerialize ($value) Chuyển chuỗi đặc biệt về trạng thái ban đầu
33 shuffle ($array) Tạo ra mảng mới (mảng liên tục) với thứ tự các phần tử trong mảng bị thay đổi
34 compact() Tạo ra mảng mới từ các biến có sẵn
35 range() Sử dụng hàm range để tạo ra các phần tử của mảng
36 array_combine ($key, $values) Tạo một mảng mới có khóa được lấy từ mảng $keys và giá trị được lấy từ mảng $value theo tuần tự (yêu cầu số phần tử ở 2 mảng phải bằng nhau)
37 array_diff ($array1, $array2) Trả về một mảng bao gồm các phần tử có giá trị tồn tại trong mảng $array1 nhưng không tồn tại trong mảng $array2
38 array_diff_key ($array1, $array2) Trả về một mảng bao gồm các phần tử có khóa tồn tại trong mảng $array1 nhưng không tồn tại trong mảng $array2
39 array_diff_assoc ($array1, $array2) Trả về một mảng bao gồm các phần tử có khóa tồn tại trong mảng $array1 nhưng không tồn tại trong mảng $array2
40 array_intersect ($array1, $array2) Trả về một mảng bao gồm các phần tử giống nhau về giá trị giữa 2 mảng $array1 và $array2
41 array_intersect_key ($array1, $array2) Trả về một mảng bao gồm các phần tử giống nhau về khóa giữa 2 mảng $array1 và $array2
42 array_intersect_assoc ($array1, $array2) Trả về một mảng bao gồm các phần tử giống nhau về khóa và giá trị giữa 2 mảng $array1 và $array2
43 array_walk() Gửi các giá trị của mảng đến một hàm nào đó để xử lý và nhận kết quả trả về là một mảng mới
44 array_map() Gửi các giá trị của một hay nhiều mảng đến một hàm nào đó để xử lý và nhận kết quả trả về là một mảng mới
45 array_stice (array, offset, length, preserve) Trích xuất lấy một đoạn phần tử của mảng từ vị trí bắt đầu offset (vị trí bắt đầu của mảng là 0) và lấy length phần tử
46 array_splice (array1, offset, length, array2) Xóa bỏ một đoạn phần tử của mảng array1 từ vị trị bắt đầu và lấy length phần tử. Sau đó thay thế các phần tử bị loại bở bằng mảng array2
47 aort(array) Sắp xếp các phần tử trong mảng array tăng dền theo giá trị
48 rsort(array) Sắp xếp các phần tử trong mảng array giảm dền theo giá trị
49 ksort(array) Sắp xếp các phần tử trong mảng array tăng dền theo khóa
50 krsort(array) Sắp xếp các phần tử trong mảng array giảm dền theo khóa

 

 

Hàm trong PHP

  1. Hàm là gì ?
  • Hàm là tập hợp một hay nhiều câu lệnh được xây dựng đề thực hiện một chức năng nào đó.
  • Khối lệnh này chỉ cần xây dựng duy nhất một lần, và có thể được sử dụng nhiều lần trong toàn bộ quá trình.
  1. Có bao nhiều hàm trong PHP
  • Hàm trong PHP được xây dựng vô cùng đa dạng và phong phú, bao gồm các hàm xử lý chuỗi, số, mảng, ngày tháng, …
  • Chúng ta tạm thời chia làm 2 nhóm hàm:
    • Hàm được cung cấp sẵn bởi PHP
    • Nhóm hàm do người dùng tự định nghĩa.
  1. Làm sao để viết một hàng trong PHP
  • Vấn đề 1: Hàm không tham số và không có trả vê
  • Vấn đề 2: Sự trả về của hàm
  • Vấn đề 3: Truyền tham số vào hàm:
    • Phân biệt biến toán cục và biến cục bộ
    • Phân biệt tham chiếu và tham trị
  • Vấn đề 4: Tìm hiểu include và require.
    • Hàm không tham số và không có trả về
  • Xây dựng hàm vẽ các box
  • Lưu ý về cách đặt tên hàm
  • Biết cách khai báo và gọi hàm không có tham số và không có trả về.
    • Sự trả về của hàm
  • Xây dựng hàm vẽ các box với sự trả về của hàm return
  • Hàm trả về một giá trị
  • Hàm trả về nhiều giá trị
  • Hàm trả về kết quả true hoặc false
    • Truyển tham số vào hàm
  • Truyển nội dung vào cho box (hàm 1 tham số)
  • Truyển truyền rộng và chiều cao của box (hàm nhiêu tham số)
  • Gán giá trị mặc định cho tham số

Cấu trúc câu lệnh trong PHP

Câu điều kiện

  • Câu điều kiện là câu lệnh chúng ta thường xuyên sử dụng khi viết mã cho bất kì ngôn ngữ lập trình nào.
  • Câu điều kiện giúp chúng ta thực hiện những hành động khác nhau trong những điều kiện khác nhau.
  • Hai nhóm loại câu điều kiện
    • IF…ELSE
      • IF
      • IF … ELSE
      • IF … ELSE IF … ELSE
      • Ví dụ
<?php

$number = 12;

if($number &gt;= 0) {

Echo “Số dương”;

}

?>

Câu điều kiện SWITCH

  • Câu điều kiện switch có một điều kiện mặc định, nghĩa là khi giá trị đưa vào không thỏa mãn một điều kiện nào thì nó sẽ lấy các câu lệnh trong phần điều kiện mặc định để thực hiện.

Vòng lặp

  • Vòng lặp là một đoạn mã lệch trong chương trình được thực hiện lặp đi lặp lại cho đến khi thỏa mãn một điều kiện nào đó.
  • Trong PHP chúng ta có 4 loại vòng lặp
    • for
    • while
    • do … while
    • for … each
  • Vòng lặp for:
  • Vòng lặp while:
  • Vòng lặp do … while:
  • Break – continue
    • Câu lệnh break có chức năng thoát khỏi một vòng lệnh. Nó có thể được sử dụng để nhảy ra khỏi một vòng lặp
    • Câu lệnh continue có chức năng dừng vòng lặp tại giá trị đó và nhảy sang giá trị khác trong vòng lặp.
while (condition) {

continue;

break;

}