PHP วิธีใช้ map ลบค่าที่ซ้ำกันในรูปแบบ array หลายมิติ


array map หลายมิติ เป็นรูปแบบของการเก็บข้อมูลตัวแปรในลักษณะเป็น array แบบซ้อนกันจึงทำให้มีสมาชิกอยู่ในนั้นได้เป็นจำนวนมาก วิธีการจัดการกับข้อมูลข้างในมีหลายรูปแบบวันนี้ผมจะพาไปดูวิธีการลดความซ้ำซ้อนของข้อมูลที่อยู่ในรูปแบบของ array หลายมิติกัน

ภาพประกอบ : array-map

ภาพประกอบ : array-map

ปัญหานี่เรามีโอกาสเจอได้บ่อยนะครับถ้าระบบของเราใหญ่เวลาเราดึงข้อมูลออกมาจากการใช้เงื่อนไขเยอะๆ ข้อมูลบางค่ามีโอกาสที่จะซ้ำกันได้ แต่เราจะทำอย่างไรหากเราไม่ต้องการให้ข้อมูลซ้ำกันถูกแสดงออกมา ในรูปแบบของ array มิติเดียวทำได้โดยการใช้งานคำสั่ง array_unique() ซึ่งจะสามารถคัดเจอค่าที่เป็นค่าซ้ำกันได้เลยในทันที ตัวอย่าง

[php]
$sMyColor = array("red","green","blue","pink","yellow","blue","green");
$sNewColor = array_unique($sMyColor);
var_dump($sNewColor);
[/php]

จากข้อมูลตัวอย่างจะพบว่าเรามีสีที่ซ้ำกันอยู่ 2 ค่าคือ blue กับ green แต่หากเราต้องการไม่ให้แสดงสีที่ซ้ำกันเราสามารถกำหนดได้โดยการเรียกผ่าน function array_unique() แล้วจากนั้นค่าที่ได้ออกมาก็จะไม่มีค่าที่ซ้ำกันเลย

แต่หากใช้งานกับ array หลายมิติใช้วิธีนี้ไม่ได้นะครับ เพราะค่าที่เราต้องการนำมาแสดงจะอยู่ใน array อีกชั้นหนึ่ง เราเลยต้องใช้วิธีอื่นกันลองดูข้อมูลตัวอย่างกันก่อนครับ

[php]
<?php
$sCars = array
(
array("Volvo",22,18),
array("BMW",15,13),
array("Toyota",5,2),
array("Honda",10,8),
array("Land Rover",17,15),
array("Honda",8,10)
);
echo "<h1>รถทั้งหมด</h1>";
foreach($sCars AS $value){
echo "ยี่ห้อ : ".$value[0]. " จำนวน ".$value[1] ;
echo "<br>";
}
echo "<br>";
var_dump($sCars );
?>
[/php]

จากข้อมูลในตัวอย่างจะพบว่าเรามีข้อมูลที่ซ้ำกันอยู่คือ Honda แต่หากเราไม่ต้องการที่จะแสดงออกมาเราจะพบว่าวิธีอย่าง unique กลับใช้ไม่ได้ผลและเกิด error ว่า “Notice: Array to string conversion” แต่เราสามารถใช้คำสั่งอย่าง array map เข้ามาช่วยได้ครับ

array_map() เป็น function ที่มีไว้สำหรับการเปลี่ยนค่าใน array ครับ โดยปรกติเราจะใช้ในการเปลี่ยนข้อมูลบางคำเมื่อได้ค่านั้นๆหรืออาจจะใช้ร่วมกับพวก htmlentities เพื่อกำหนดค่าที่ได้รับมาก็ได้ครับ โดยค่าแรกจะเป็นค่าที่เรารับมาครับ แล้วอีกค่าเป็น call back คืนกลับไป แต่ครั้งนี้เราจะใช้สำหรับลบค่าที่ซ้ำกันออกไปจาก array ดังนั้นเราจำเป็นต้องเพิ่งความสามารถของ function สำหรับจัดการกับ array อย่าง serialize() ครับ ซึ่งมันเป็น function เพื่อถอดรูปของ array ออกมาเป็น string ได้แล้วเราก็ใช้ unserialize() ส่งค่าคืนกลับไปเข้าสู่ array เหมือนเดิมครับ

ลองดูวิธีทำกันครับ

[php]
$sNewCars = array_map("unserialize",array_unique(array_map("serialize",$sCars))); 
[/php]

 

 

ทีนี้เราก็จะได้ค่าที่ถูกแปลงออกมาแบบไม่ซ้ำกันแล้วครับ ลองดู

ภาพประกอบ : array

ภาพประกอบ : array

 

อ้างอิง : http://php.net/manual/en/function.unserialize.php

ใส่ความเห็น