Danh mục : PHP - PHP5- PHP7

Làm việc với mảng trong PHP

Các vấn đề chính sẽ được đề cập: - Làm thế nào để tạo 1 mảng trong PHP. - Cách duyệt qua tất cả các phần tử trong 1 mảng. - Sơ lược về mảng nhiều chiều

Làm việc với mảng trong PHP

Các vấn đề chính sẽ được đề cập:
- Làm thế nào để tạo 1 mảng trong PHP.
- Cách duyệt qua tất cả các phần tử trong 1 mảng.
- Sơ lược về mảng nhiều chiều


Mở đầu

Mảng là một cách hiệu quả để nhóm một lượng dữ liệu lại với nhau thành một khối duy nhất. Mảng trong PHP cũng như các ngôn ngữ khác (C/Java/VB), nó bao gồm 2 phần: khoá và giá trị (key và value). Nhưng vẫn có sự khác biệt, các khoá và giá trị trong PHP được dùng một cách tự do, không theo một ràng buộc quá mức nào cả. Bạn hoàn toàn có thể dùng một chuỗi để làm khoá, cũng như nhóm các giá trị không cùng kiểu dữ liệu với nhau lại làm thành một mảng. Description: http://www.updatesofts.com/forums/images/smilies/1.gif

 

 

Tạo và thêm dữ liệu vào mảng

Mảng được tạo dễ dàng bằng từ khoá array, và có thể thêm dữ liệu ngay trong phần nội dung của mảng. Nếu bạn thích dùng một key theo ý thích của mình thì có thể dùng toán từ => để thêm dữ liệu (value) cho key đó. Description: http://www.updatesofts.com/forums/images/smilies/17.gif

Hơi khó hiểu, nhưng bạn hãy xem những ví dụ dưới đây để biết rõ hơn về cách tạo mảng cũng như cách lưu trữ giá trị trong mảng của PHP:

PHP Code:



  // PHP tự động gán key khi bạn tạo một mảng, bắt đầu từ key 0  
  // trong ví dụ dưới, key 0 có giá trị là "Piper", 
  // tương tự cho key 1, 2 và 3. 
  $airplanes = array("Piper""Cessna""Beech""Cirrus"); 

  // Chúng ta cũng có thể tạo key theo ý thích của chúng ta,  
  //không bắt buộc phải là số 
  $home = array("size" => 1800"style" => "ranch"
                "yearBuilt" => 1955"numBeds" => 3
                "numBaths" =>2"price" => 150000); 
?>

 

PHP Code:



  // key của một mảng không bắt buộc bắt đầu phải là 0. 
  // Chẳng hạn, key 123 được dùng làm key bắt đầu trong ví dụ này. 
  $noises[123] = "hissssssss"

  // và khi khai báo như thế này, key tiếp theo của mảng sẽ là 124 
  $noises[] = "gobble gobble"

?>


Truy xuất vào 1 phần tử của mảng

Bạn có thể truy xuất phần tử của mảng bằng cách gọi key của nó:

PHP Code:


  // ví dụ về cách gọi key là 1 số 
  $breads = array("baguette""naan""roti""pita"); 
  echo "I like to eat "$breads[3] . "
\n"


  $computer = array("processor" => "Muncheron 6000"
                    "memory" => 2048"HDD1" => 80000
                    "graphics" => "NTI Monster GFI q9000"); 

  // ví dụ về cách gọi key là 1 chuỗi 
  echo "My computer has a " $computer['processor'
       . " processor
\n"


?>


Xoá phần tử khỏi mảng

Để xoá 1 phần tử nào đó của mảng, bạn dùng từ khóa unset cho phần tử đó:

PHP Code:



  $drinks = array("Coffee""Café au Lait""Mocha""Espresso"
                  "Americano""Latte"); 
  unset($drinks[3]);    // xóa phần tử "Mocha" khỏi mảng. 

?>

Còn muốn xoá toàn bộ phần tử của mảng, bạn cũng dùng từ khoá unset, nhưng cho toàn bộ mảng:

PHP Code:



  unset($drinks);   // mảng $drinks giờ đã bị xóa sạch dữ liệu 

?>

Đếm số phần tử của mảng

Sử dụng từ khoá count:

PHP Code:



  $drinks = array("Coffee""Café au Lait""Mocha""Espresso"
                 "Americano""Latte"); 
  $elems count($drinks); 

  // kết quả sẽ là 6. 
  echo "The array \$drinks has $elems elements
\n"


?>


II. Duyệt tất cả các phần tử của mảng

Vòng lặp foreach

PHP Code:

foreach (array as [key =>] values
  khối lệnh  

 


Vòng lặp này sẽ duyệt qua từng phần tử một trong mảng, nó sử dụng một biến cho trước để tạo một bảng copy phần tử mà nó đang duyệt tới và xử lý trên biến đó. Vòng lặp kết thúc khi không còn phần tử nào để duyệt. Description: http://www.updatesofts.com/forums/images/smilies/36.gif

PHP Code:



  $drinks = array("Coffee""Café au Lait""Mocha""Espresso"
                  "Americano""Latte"); 
  foreach ($drinks as $drink
  { 
    echo "We serve $drink
\n"

  } 

?>


Vòng lặp thông thường (for)

Vòng lặp for hoàn toàn có thể được dùng để duyệt qua tất cả các key của mảng: Description: http://www.updatesofts.com/forums/images/smilies/22.gif

PHP Code:



  $drinks = array("Coffee""Café au Lait""Mocha""Espresso"
                  "Americano""Latte"); 

  for ($x 0$x count($drinks); $x++) 
  { 
    echo "We serve '$drinks[$x]'
\n"

  } 

?>


III. Mảng nhiều chiều (Multi-Dimensional Arrays)

Rất nhiều trường hợp bạn muốn lưu trữ nhiều mảng trong 1 mảng có sẵn. Khi đó, chúng ta có mảng một nhiều chiều. Và rất may mắn là PHP hỗ trợ rất mạnh mẽ và dễ dàng trong việc tạo mảng nhiều chiều. Description: http://www.updatesofts.com/forums/images/smilies/36.gif

Thật vậy, đây là cách mà mảng nhiều chiều được tạo trong PHP Description: http://www.updatesofts.com/forums/images/smilies/1.gif:

PHP Code:



  $bikes = array(); 
  $bikes["Tourmeister"] = array("name" => "Grande Tour Meister"
                                "engine_cc" => 1100
                                "price" =>12999); 
  $bikes["Slasher1000"] = array("name" => "Slasher XYZ 1000"
                                "engine_cc" => 998
                                "price" => 11450); 
  $bikes["OffRoadster"] = array("name" => "Off-Roadster"
                                "engine_cc" => 550
                                "price" => "4295"); 

?>

Còn đây là cách truy xuất vào các phần tử của mảng nhiều chiều:

PHP Code:



  $names array_keys($bikes); 

  foreach ($names as $name
  { 
    print $bikes[$name] . " costs: " $bikes[$name]["price"
          . "
\n"

  } 

?>


IV. Lời kết

Mảng là một khai báo rất dễ dàng trong PHP. Việc học về mảng thật ra không có gì khó, chỉ cần đọc qua các ví dụ, bạn cũng hoàn toàn có thể rút ra cho mình được phương thức mà PHP tạo một mảng đơn giản. Description: http://www.updatesofts.com/forums/images/smilies/38.gif

Have fun. Description: http://www.updatesofts.com/forums/images/smilies/8.gif

 

Làm việc với mảng (Array) trong PHP (tiếp)

 

Sắp xếp mảng

Do PHP lưu trữ các phần tử trong mảng theo thứ tự chúng được đưa vào mảng, chính vì vậy đôi lúc sẽ nảy sinh nhu cầu sắp xếp các phần từ trong mảng. Để sắp xếp ta có thể dùng các hàm có sẵn của PHP, tiêu biểu là hàm sort

PHP Code:


    $arr = array(536421); 
    var_dump($arr); 
    echo "
\n"

    sort($arr); 
    var_dump($arr); 
?>


Kết quả thu được sẽ là:

Quote:

array(6) { [0]=> int(5) [1]=> int(3) [2]=> int(6) [3]=> int(4) [4]=> int(2) [5]=> int(1) }
array(6) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [5]=> int(6) }


Các bạn có thể thấy là các giá trị đã được sắp xếp tăng dần tuy nhiên các key cũng đã bị thay đổi. Để dữ nguyên các key ban đầu, ta sử dụng hàm asort. Thay thế hàm sort trong ví dụ bằng asort thì sẽ thu được kết quả như sau:

Quote:

array(6) { [0]=> int(5) [1]=> int(3) [2]=> int(6) [3]=> int(4) [4]=> int(2) [5]=> int(1) }
array(6) { [5]=> int(1) [4]=> int(2) [1]=> int(3) [3]=> int(4) [0]=> int(5) [2]=> int(6) }


Các hàm này cũng sẽ làm việc tốt đẹp với các xâu kí tự, tuy nhiên với 1 mảng có các giá trị "report1.pdf", "report5.pdf", "report10.pdf", and "report15.pdf" thì kết quả thu được sẽ là:

Quote:

"report1.pdf", "report10.pdf", "report15.pdf", "report5.pdf"


Đơn giản là vì mã ASCII của "1" nhỏ hơn "5" nên kết quả sẽ ra như vậy. Để giải quyết vấn đề này, thay vì sort và asort ta sử dụng natsort hoặc natcasesort. Kết quả thu được sẽ là:

Quote:

"report1.pdf", "report5.pdf", "report10.pdf", "report15.pdf"


Sắp xếp mảng nâng cao

Giả sử bạn có mảng nhiều chiều sau:

PHP Code:


    $bikes = array(); 
    $bikes["Tourmeister"] = array("name" => "Grande Tour Meister"
                                "engine_cc" => 1100
                                "price" =>12999); 
    $bikes["Slasher1000"] = array("name" => "Slasher XYZ 1000"
                                "engine_cc" => 998
                                "price" => 11450); 
    $bikes["OffRoadster"] = array("name" => "Off-Roadster"
                                "engine_cc" => 550
                                "price" => "4295"); 
?>


Khi muốn sắp xếp mảng $bikes theo price của mỗi phần tử thì làm thế nào? Không thể dùng các hàm ở trên được! Vậy giải pháp duy nhất là ta sẽ phải tự sắp xếp

PHP Code:


    function compare_price($in_bike1$in_bike2
    { 
        if ($in_bike1["price"] > $in_bike2["price"]) 
        { 
            return 1
        } 
        else if ($in_bike1["price"] == $in_bike2["price"]) 
        { 
            return 0
        } 
        else 
        { 
            return -1
        } 
    } 

    uasort($bikes"compare_price"); 
    foreach ($bikes as $bike
    { 
        echo "Bike {$bike['name']} costs \${$bike['price']}
\n"

    } 
?>


Trong ví dụ trên, mấu chốt chính là ở hàm uasort, hàm này sẽ so sánh từng giá trị trong mảng với nhau bằng hàm so sánh compare_price. Hàm này sẽ so sánh 2 giá trị được đưa vào là $in_bike1 và $in_bike2 rồi trả lại 1 trong 3 giá trị: 1, 0 hoặc (-1) khi so sánh price của $in_bike1 và $in_bike2. Sau cùng ta sẽ thu được kết quả:

Quote:

Bike Off-Roadster costs $4295
Bike Slasher XYZ 1000 costs $11450
Bike Grande Tour Meister costs $12999


Sắp xếp ngược lại

Trong các phần trên ta đều thấy sắp xếp tăng dần, vậy để sắp xếp giảm dần thì làm thế nào? Ta có thể sử dụng rsort và arsort thay thế cho sort và asort. Chú ý là không có ursort! Để sắp xếp ngược lại bạn chỉ cần đảo ngược thứ tự trong hàm so sánh của mình

Sắp xếp theo key

Để sắp xếp theo key, ta có các hàm ksortkrsort, và uksort. Sắp xếp theo key sẽ luôn giữ nguyên các key vì vậy không có kasort. Các giá trị đi kèm mỗi key cũng sẽ được giữ nguyên

Các hàm khác

array_merge
Hàm này sẽ nhận vào 2 mảng và trả lại 1 mảng trong đó bao gồm tất cả các giá trị của 2 mảng ban đầu. Các key sẽ được giữ nguyên trừ trường hợp:

  1. 2 mảng có 1 key là xâu kí tự giống nhau, thì giá trị của mảng thứ nhất sẽ bị ghi đè bằng giá trị của key đó ở mảng thứ hai
  2. Ở mảng thứ hai nếu trùng các key là số nguyên với mảng thứ nhất, thì các giá trị của mảng thứ hai sẽ nhận 1 key mới (không ghi đè)

Xét ví dụ:

PHP Code:


    $ar1 = array('name' => 'Zeke'10100); 
    $ar2 = array('name' => 'Zimbu'234); 

    $newar array_merge($ar1$ar2); 

    print_r($newar); 
?>


Kết quả thu được sẽ là:

Quote:

Array (
[name] => Zimbu
[0] => 10
[1] => 100
[2] => 2
[3] => 3
[4] => 4
)


array_combine

Hàm này nhận vào 2 mảng rồi trả lại 1 mảng, trong đó các key là các giá trị của mảng thứ nhất, các giá trị là từ mảng thứ hai. Nếu 2 mảng không có cùng số phần tử sẽ báo lỗi. Xét ví dụ sau:

PHP Code:


    $ar1 = array('name''age''height'); 
    $ar2 = array('Bob'23'5\'8"'); 

    $newary array_combine($ar1$ar2); 

    print_r($newary); 
?>


Kết quả thu được sẽ là:

Quote:

Array (
[name] => Bob
[age] => 23
[height] => 5'8"
)


array_intersect

Hàm này nhận vào 2 mảng rồi trả lại các phần tử cùng có ở 2 mảng. Các key sẽ được giữ nguyên, nếu cùng 1 giá trị mà lại có 2 key khác nhau thì key ở mảng thứ nhất sẽ được sử dụng. Xét ví dụ sau:

PHP Code:


    $ar1 = array('name' => 'Zeke'10100); 
    $ar2 = array('eeek' => 'Zeke'23410); 

    $newar array_intersect($ar1$ar2); 

    print_r($newar); 
?>


Kết quả thu được (đoán trước rồi hãy đọc xem có đúng kô nhé Description: http://www.updatesofts.com/forums/images/smilies/4.gif)

Quote:

Array (
[name] => Zeke
[0] => 10
)


array_search

Cái tên nói lên tất cả ^o^ Khi bạn cần tìm 1 giá trị trong mảng thì sử dụng hàm này. Cấu trúc rất đơn giản:

PHP Code:


  $ar1 = array(1101002344562354); 

  var_dump(array_search(100$ar1)); 
  var_dump(array_search(3333$ar1)); 
?>


Và đây là kết quả:

Quote:

int(2)
bool(false)


Sau khi nắm hết các hàm này thì làm việc với mảng bạn sẽ thấy rất dễ dàng thoải mái Description: http://www.updatesofts.com/forums/images/smilies/4.gifEnjoy >Description: http://www.updatesofts.com/forums/images/smilies/4.gif<

PS: hihi, được 25 points rồi :P

 

Mr.paint(UDS)

 

 


Tags