ผมขอยกภาษาที่ถนัดสุดละกัน คือ PHP

สมมติผมมี array 1 ชุด

$ar = array('A','B','D','E');

มันก็จะเป็น $ar[1],......

ทีนี้ ถ้าผมอยากเอา $ar[2] ออกงี้

หรือจะเพิ่มค่า C ลงไปหลัง B

ก็จะกลายเป็น $ar[2]=C ตัวอื่นๆ ก็จะถูกจัดเรียง index ใหม่แบบอัตโนมัติ

"ทำไมถึงไม่มีคำสั่งเอาออกในตำแหน่งนั้นๆ โดยตรง และเรียง index ให้เลยครับ"

ทำไมต้อง push, pop อะไรพวกนี้

หรือจริงๆ แล้วมี แต่ผมไม่รู้ @_@

สาเหตุที่ทำให้มันไม่สามารถเอาออกได้ดื้อๆ เป็นเพราะอะไร (ไม่เอาเรื่อง data structure)

Hiring! บริษัทที่น่าสนใจ

Carmen Software company cover
Carmen Software
Hotel Financial Solutions
Next Innovation (Thailand) Co., Ltd. company cover
Next Innovation (Thailand) Co., Ltd.
We are web design with consulting & engineering services driven the future stronger and flexibility.
KKP Dime company cover
KKP Dime
KKP Dime บริษัทในเครือเกียรตินาคินภัทร
Kiatnakin Phatra Financial Group company cover
Kiatnakin Phatra Financial Group
Financial Service
Fastwork Technologies company cover
Fastwork Technologies
Fastwork.co เว็บไซต์ที่รวบรวม ฟรีแลนซ์ มืออาชีพจากหลากหลายสายงานไว้ในที่เดียวกัน
Thoughtworks Thailand company cover
Thoughtworks Thailand
Thoughtworks เป็นบริษัทที่ปรึกษาด้านเทคโนโยลีระดับโลกที่คว้า Great Place to Work 3 ปีซ้อน
Iron Software company cover
Iron Software
Iron Software is an American company providing a suite of .NET libraries by engineer for engineers.
CLEVERSE company cover
CLEVERSE
Cleverse is a Venture Builder. Our team builds several tech companies.
Nipa Cloud company cover
Nipa Cloud
#1 OpenStack cloud provider in Thailand with our own data center and software platform.
Bangmod Enterprise company cover
Bangmod Enterprise
The leader in Cloud Server and Hosting in Thailand.
CIMB THAI Bank company cover
CIMB THAI Bank
MOVING FORWARD WITH YOU - CIMB is the leading ASEAN Bank
Bangkok Bank company cover
Bangkok Bank
Bangkok Bank is one of Southeast Asia's largest regional banks, a market leader in business banking
MuvMi (Urban Mobility Tech Co.,Ltd.) company cover
MuvMi (Urban Mobility Tech Co.,Ltd.)
Shape the future of urban mobility towards affordable, clean, and safe solutions
T.N. Digital Solution Co., Ltd. company cover
T.N. Digital Solution Co., Ltd.
TNDS has been involving in every first move of banking’s major digital transformation.
KBTG - KASIKORN Business-Technology Group company cover
KBTG - KASIKORN Business-Technology Group
KBTG - "The Technology Company for Digital Business Innovation"
Siam Commercial Bank Public Company Limited company cover
Siam Commercial Bank Public Company Limited
"Let's start a brighter career future together"
Icon Framework co.,Ltd. company cover
Icon Framework co.,Ltd.
Global Standard Platform for Real Estate แพลตฟอร์มสำหรับธุรกิจอสังหาริมทรัพย์ครบวงจร มาตรฐานระดับโลก
REFINITIV company cover
REFINITIV
The Financial and Risk business of Thomson Reuters is now Refinitiv
H LAB company cover
H LAB
Re-engineering healthcare systems through intelligent platforms and system design.
The Gang Technology Co., Ltd. company cover
The Gang Technology Co., Ltd.
We're a Digital Agency that helps our customers transform their business into digital with ease.
LTMH company cover
LTMH
LTMH มุ่งเน้นการพัฒนาผลิตภัณฑ์ที่สามารถช่วยพันธมิตรของเราให้บรรลุเป้าหมาย
Seven Peaks company cover
Seven Peaks
We Drive Digital Transformation
Wisesight (Thailand) Co., Ltd. company cover
Wisesight (Thailand) Co., Ltd.
The Best Choice For Handling Social Media · High Expertise in Social Data · Most Advanced and Secure
MOLOG Tech company cover
MOLOG Tech
We are Modern Logistic Platform, Specialize in WMS, OMS and TMS.
Data Wow Co.,Ltd company cover
Data Wow Co.,Ltd
We enable our clients to realize increased productivity by solving their most complex issues by Data
LINE Company Thailand company cover
LINE Company Thailand
LINE, the world's hottest mobile messaging platform, offers free text and voice messaging + Call
LINE MAN Wongnai company cover
LINE MAN Wongnai
Join our journey to becoming No.1 food platform in Thailand

ศึกษา Data Structure ครับ Array มันเป็นพื้นฐาน
จะแทรกอะไรแบบนั้น ลองดูพวก List ครับ ไม่รู้ PHP มีหรือป่าว ไม่ถนัดครับ

บางที ที่มันไม่มี ก็เพราะมันแค่ไม่มี
แต่ว่าเราก็ยังสามารถทำได้ด้วยคำสั่งอื่นๆหลายคำสั่งแทน
ทำให้ไม่มีการพัฒนาจุดนั้นขึ้นมา

คงไม่มีเหตุผลเชิงวิชาการหรอกครับ ว่าทำไมถึงไม่มี

อันที่จริงภาษาโปรแกรมทุกภาษา ก็มีอีกหลายอย่าง ที่ไม่มี และก็ไม่มีเหตุผลเชิงวิชาการมาบอก ว่าทำไมถึงไม่มี
แต่โดยทั่วไป เราก็ใช้คำสั่งอื่นๆ มาประยุกต์เพื่อให้สามารถได้ผลลัพธ์ที่ต้องการได้

หากใครเขียน PHP มานานๆจะรุ้ว่า PHP มักจะมีคำสั่งสำเร็จรูปอยู่จำนวนมาก (ยกตัวอย่างเช่น mail() )
ซึ่งถ้าถามว่า ภาษาอื่นทำไมถึงไม่มีหละ คำตอบก็คือ ก็เพราะแค่มันไม่มีเฉยๆ
หลายๆคำสั่งใน PHP นั้น สามารถทำงานได้ด้วยคำสั่งเดียว แต่ในอีกหลายภาษานั้นก็ไม่มีคำสั่งสำเร็จรูปแบบ PHP

สรุปแล้ว ผมว่า ที่มันไม่มี ก็เพราะแค่ว่า มันไม่มี เฉยๆ

ถ้าไม่เอาเรื่อง data structure ก็คงต้องพูดกันในเรื่องของ compiler ครับ ว่าการออกแบบตัวแปรชนิด array มันเป็นการจอง memory ของข้อมูลในตำแหน่งของ address ที่ติดกัน เพราะฉะนั้น การที่จะเอาออกแบบนั้นมันจะทำให้ เกิดช่องว่างระหว่าง address ซึ่งถ้าจะให้เรียง index ใหม่ ก็ต้องขยับข้อมูลเอาไปแทนที่ข้อมูลเดิมที่เอาออก

ปัญหามันจะอยู่ตรงที่ถ้าข้อมูลเรายาวมากๆ การขยับแต่ละครั้งมันจะเปลือง performance มากๆ ก็เลยมีการคิดการเก็บข้อมูลอย่างอื่นเช่นพวก linklist ทำให้เอาออก หรือแทรกได้โดยไม่เปลือง performance มากนัก

ขอเพิ่มเติมแล้วกันครับ

ถ้าเป็น Array ในภาษา C มันจะเป็น Memory ผืนเดียวกันยาวๆ เพราะฉะนั้น การแทรกกลาง หรือการลบเฉพาะแค่ตรงกลาง มันไม่ค่อยสมเหตุสมผลเท่าไหร่ครับ และ PHP ก็อาจจะได้ผลมาจากคนที่เคยเขียนภาษา C จะรู้สึกแปลกๆ ที่จะแทรกข้อมูลลงไปใน Array ก็เลยไม่มีก็เป็นได้ :)

แต่สำหรับ PHP แค่ลบใช้รู้สึกจะใช้ unset() ตามคุณ lancaster บอกได้

เหตุผล (ที่ไม่ใช่เชิง data structure) คือ คนสร้างภาษาเค้าไม่ได้ใช้ฟังก์ชันนั้น เลยไม่ได้เขียนไว้ให้เราใช้ครับ

ผมยกตัวอย่าง Python ที่ไม่มีข้อมูลแบบ array ให้ใช้ แต่มี list ซึ่งสามารถทำงานได้เหมือนกัน และน่าจะมีความสามารถอย่างที่คุณถาม
{syntaxhighlighter class="brush: python"}
l = ['a', 'b', 'd', 'e']

l[2:2] = ['c']
print(l)

get: ['a', 'b', 'c', 'd', 'e']

l[1:2] = []
print(l)

get: ['a', 'c', 'd', 'e']

{/syntaxhighlighter}

ถ้าตามความคิดผม

คำสั่งใน C แต่ละคำสั่ง ก็ถูกแปลงเป็นภาษาเครื่องอยู่แล้ว ซึ่งคำสั่งจาก C หนึ่งคำสั่งนั้น
อาจจะถูกแปลงเป็นภาษาเครื่อง หลายคำสั่งรวมกันก็ได้

(assembly Move ไป Move มา หลายๆครั้งรวมๆกัน เป็นเรื่องปรกติอยู่แล้ว)

ดังนั้น ถ้า C จะทำคำสั่งให้สามารถแทรก array ได้ก็ไม่ใช่เรื่องยาก
และหาก C มีคำสั่งนั้นจริงๆ คำสั่งนั้น มันก็จะทำงานเร็วกว่าการใช้คำสั่งหลายๆคำสั่งใน C มารวมกัน
เพื่อประยุกต์ให้แก้ปัญหานี้ได้ แน่นอน

เพราะว่า ถ้าภาษา C หนึ่งคำสั่ง แปลงเป็นภาษาเครื่องชุดเล็กๆ
น่าจะรวมแล้วเล็กกว่า คำสั่ง C หลายๆคำสั่งรวมกัน

ดังนั้นเหตุผลว่า เพราะเปลืองทรัพยากร คงจะไม่ใช่ หรือความยากในการเขียน ก็คงจะไม่ใช่
เพราะผมรับรองว่า คำสั่ง for , if , while นั้นแปลงเป็นภาษาเครื่อง ยุ่งยากกว่าการย้าย array แน่นอน

เหตุผลที่ไม่มีก็คือ นักพัฒนาไม่สามารถทำทุกอย่างได้
ไม่เช่นนั้น นักพัฒนาอาจจะต้องใช้เวลาเป็นสิบปี เพื่อเก็บตกคำสั่งเล็กน้อยทั้งหมดไม่ว่ามันจะคืออะไรก็ตามแต่

แต่การพัฒนาคำสั่งพื้นฐาน ที่สามารถนำมาประยุกต์ได้หลากหลายนั้น น่าจะเป็นทางเลือกที่ดีที่สุด

แต่ภาษาในปัจจุบัน เช่น C# หรือ C++ หรือ Java นั้นก็ถูกพัฒนามาจากการเรียนรู้ในอดีต
หลายๆฟังชั่น ที่อดีตไม่เคยมี โปรแกรมเมอร์ในอดีตต้องใช้คำสั่งที่ยุ่งยาก เพื่อแก้ปัญหา
พอมาถึงยุคใหม่ ก็ถูกแทนที่ด้วยคำสั่งใหม่ที่มาแก้ปัญหาเหล่านั้น

ผมเชื่อว่า หากคุณพิสูจน์ได้ว่า คำสั่งแทรก array ตรงกลางนั้น ควรค่าแก่การถูกพัฒนาขึ้นมาจริงๆ
ภาษาในยุคต่อไป ก็จะมีคำสั่งนี้แน่นอน

จะทำให้มันเรียงข้อมูลทุกครั้งที่ add ข้อมูลใหม่ไปก็ได้ครับ แต่มันจะมีกระบวนการเพิ่มขึ้นมากกว่าเดิมและทำให้ช้าลงเมื่อข้อมูลมีจำนวนมาก และ object (เช่นพวก class, struct, array) จะไม่สามารถ sort ได้อย่างถูกต้อง โปรแกรมเมอร์ต้องเป็นคนใส่เงื่อนไขการ sort เข้าไปเอง

ดังนั้นจึงไม่ได้ใส่กระบวนการเรียงข้อมูลเข้าไปใน array หากต้องการ sort ก็เรียกใช้ function สำหรับ sort เอาเองจะดีกว่า

อนึ่ง ผมคิวว่าคงจะป่วยการ ถ้าจะพูดกันเรื่องนี้ทั้งที แต่กลัว data structure (จะกลัวไปทำไม?)

array แต่เดิมในภาษา C นั้น (เหมือนที่คุณ PiKO อธิบาย) เป็นการเก็บข้อมูลชุดหลายๆ ตัวอย่างง่ายที่สุด มันเกิดจากการจองพื้นที่เป็นบล๊อกติดๆ กันไว้จำนวนหนึ่ง แล้วก็ใส่ข้อมูลอย่างเรียงลำดับลงไปในแต่ละบล๊อก ส่วนตัวแปรต้นของมันนั้นจะเก็บที่อยู่ของบล๊อกแรกสุดเอาไว้ ถ้าเราต้องการเข้าไปหาข้อมูลที่ตัวไหน ก็เอาที่อยู่แรกสุด มาบวกเพิ่มกับขนาดของบล๊อกที่เราจะไป เราก็จะเจอข้อมูลตัวที่เราหานั่นเอง

แต่การ implement แบบนี้ ก็มีข้อเสียที่การเอาข้อมูลตัวตรงกลางๆ ออกใช้เวลามาก เพราะเราไม่สามารถปล่อยให้เหลือช่องว่างอยู่ภายใน array ได้ จึงมี linked list ขึ้นมา ซึ่งคราวนี้บล๊อกแต่ละบล๊อกไม่จำเป็นต้องอยู่ใกล้กันแล้ว แต่บล๊อกต่างๆ จะเก็บข้อมูลเพิ่มขึ้นมาคือที่อยู่ของตัวถัดไป ถ้าเราต้องการเข้าไปหาตัวลึกๆ จะเสียเวลามากหน่อยเพราะต้องเริ่มเข้าตั้งแต่ต้นทาง แล้วก็ถามหาตัวถัดไปเรื่อยๆ ข้อดีของวิธีนี้คือ การเอาตัวกลางๆ ออกจะเร็ว เพราะเราก็แค่บอกตัวก่อนหน้าให้เปลี่ยนที่อยู่ชี้ไปยังตัวถัดไปจากเราซะ ไม่ต้องเลื่อนตัวที่เหลือให้เขยือบเข้ามา

จากข้อเสียของ linked list ที่แม้จะเอาตัวกลางๆ ออกได้ไวก็จริง แต่การเข้าไปหาตัวกลางๆ ก็กินเวลามาก (เพราะเราไม่รู้ว่ามันอยู่ตรงไหนกันแน่จนกว่าจะถามทางตัวแรกสุดมาจนครบ) ก็มีวิธี implement แบบ hash table ขึ้นมา ซึ่งมันรับประกันความเร็วในการเข้าถึงข้อมูลตัวต่างๆ ว่าจะใช้เวลาเท่ากันหมด โดยมันจะนำชื่อที่อยู่ที่เราอ่านออก (เช่น ตำแหน่งที่ 0, 1, 2, a, b, c...) ไปเข้าอัลกอริทึม hash ซึ่งจะให้ผลออกมาเป็นตัวเลขที่ดูเหมือนว่ามั่วๆ สะเปะสะปะ (เช่น 0 -> 15, 1 -> 7, 2 -> 13, a -> 8) แล้วก็เก็บข้อมูลลงไปเหมือนกับ array ธรรมดาที่ยอมมีช่องว่างของตัวที่ไม่ใช้

แต่ข้อเสียของ hash table คือ ข้อมูลในนั้นจะไม่ถูกจดจำอย่างเรียงลำดับ (โดยคอมพิวเตอร์) เช่น เวลาเราพูดถึง 0 คอมพิวเตอร์จะมองเห็นว่ามันอยู่ตำแหน่งที่ 15 แทน

และนี่ก็น่าจะเป็นฝันร้ายของ PHP โปรแกรมเมอร์ เพราะ array ใน PHP แท้จริงแล้วมันคือ hash table นั่นเอง แม้ว่าเราจะ unset index ตำแหน่งตรงกลางๆ ของ array ไปแล้ว แต่กลับกลายเป็นว่าช่องนั้นจะโหว่ไปเลย index ตัวที่มากกว่าจะไม่ถูกเลื่อนลงมาให้ครับ

ไม่แน่ใจว่าเข้าใจถูกหรือเปล่า php จะมีคำสั่งให้สามารถเพิ่ม แทนที่หรือลบค่าใน array ที่อยู่ตรงกลางได้ครับ คือ array_splice()

http://th.php.net/manual/en/function.array-splice.php

ถ้าไม่ตรงกับที่ต้องการต้องขอโทษด้วยนะครับ

แหม่ .... กำลังจะมาพิมพ์เลยครับ :P array_splice() นี่คนรู้จักน้อย ยิ่งถ้าไม่เคยเปิด reference เลยก็ไม่รู้จักแน่นอน

ฝากถึงคุณ nevermore ผมไม่รู้ว่าผมสอนจระเข้ว่ายน้ำหรือเปล่า

ผมอ่าน PHP reference เป็นงานอดิเรก ... แล้วก็ภาษาอื่นๆ ที่ผมต้องใช้ด้วย ฟังก์ชันบางอย่างมันมี แต่คุณไม่รู้ บางอย่างก็ไม่มีต้องใช้ workaround ช่วยครับ

ใน PHP reference ยังมีตัวอย่างดีๆ พร้อมคำอธิบายที่มาที่ไปของ argument (so, my argument is never invalid) ถ้าอ่านให้ครบๆ (อ้างอิง, see also, link ในส่วนต่างๆ ฯลฯ) จะเข้าใจการทำงานของฟังก์ชันต่างๆ เป็นอย่างดีอีกด้วยครับ

nevermore Mon, 02/04/2012 - 16:57

In reply to by PaPaSEK

array_splice() ผมไม่เคยใช้จริงๆ นะ เพิ่งจะเห็นนะครับ

Mannual ผมเข้าเป็นปกติตลอดเลย แต่ไม่เคยเปิดดูเลย ส่วนใหญ่ก็ใช้แต่เดิมๆ ตลอด

ลองเปิดดูฟังก์ชั่นเกี่ยวกับ array ทั้งหมดดูครับ ไล่อ่านทีละอันเลย

PHP มีฟังก์ชันหยุมหยิม ยิบย่อยให้ใช้งานเยอะมากครับ

"ทำไมถึงไม่มีคำสั่งเอาออกในตำแหน่งนั้นๆ โดยตรง และเรียง index ให้เลยครับ"

สั้นๆ คือ เรื่องประสิทธิภาพของโปรแกรมครับ (ซึ่งจะเห็นชัดเมื่อมีการใช้งานบ่อยๆ หรือ ใชักับข้อมูลขนาดใหญ่)

เราสามารถที่จะเขียนฟังก์ชั่นขึ้นมาเฉพาะเพื่ออำนวยความสะดวกในการเรียกใช้งานง่ายๆ ตามที่ตัวอย่างนี้ต้องการก็ได้ครับ .. ซึ่งถ้าเขียนใช้เองมันก็ไม่มีปัญหาอะไร .. แต่ถ้าดันเขียนแล้วปล่อยเผยแพร่ให้คนอื่นใช้ มันก็ต้องมี algorithm ที่ดีหน่อยมันจะได้ไม่อายเค้าครับ ^^