ห้องสมุดนี้ไม่ได้อยู่ในการพัฒนาที่ใช้งานอยู่ ห้องสมุดคอลเลกชันอื่น ๆ ที่ให้ฟังก์ชั่นส่วนใหญ่ที่เราต้องการนอกกรอบ
แก้ไขข้อบกพร่องเท่านั้น
ArrayObject เป็นไลบรารี PHP ที่ให้อินเทอร์เฟซน้ำหนักเบาสำหรับการทำงานอย่างคล่องแคล่วด้วย Array's
ArrayObject จัดให้มี wrapper เกี่ยวกับประเภท array ในตัวของ PHP ซึ่งรวมถึงวิธีการกรองและการดึงรายการและปฏิบัติต่อแต่ละรายการและคอลเลกชันเป็นวัตถุเดียวกัน
สิ่งนี้มีประโยชน์อย่างยิ่งสำหรับการทำงานกับการตอบสนอง JSON จากคำขอ API
ไลบรารีนี้ใช้โดยไคลเอนต์ Hyper HTTP เพื่อทำการแยกข้อมูลจากการตอบสนองที่ใช้งานง่าย
composer require rexlabs/array-object <?php
require ' vendor/autoload.php ' ;
use Rexlabs ArrayObject ArrayObject ;
// Initialise from an Array
$ obj = ArrayObject:: fromArray ([...]);
// Initialise from a JSON encoded string
$ obj = ArrayObject:: fromJson ( $ str );
// Output to array
$ arr = $ obj -> toArray ();
// Output to JSON encoded string
$ json = $ obj -> toJson ();ตัวอย่างด้านล่างจะขึ้นอยู่กับข้อมูลอินพุตติดตาม
{
"books" : [
{
"id" : 1 ,
"title" : " 1984 " ,
"author" : " George Orwell "
},
{
"id" : 2 ,
"title" : " Pride and Prejudice " ,
"author" : " Jane Austen "
}
]
} $ obj -> books ; // Instance of ArrayObject
$ obj -> books -> pluckArray ( ' author ' ); // array [ 'George Orwell', 'Jane Austen' ]
$ obj -> pluckArray ( ' books.author ' ); // array [ 'George Orwell', 'Jane Austen' ]
$ obj -> books -> count (); // 2
$ obj -> books -> isCollection (); // true
$ obj -> books [ 0 ]; // Instance of ArrayObject
$ obj -> books [ 0 ]-> isCollection (); // false
$ obj -> books [ 0 ]-> id ; // 1หมายเหตุ: วิธีการทั้งหมดอย่างสง่างามจัดการการรักษาแต่ละรายการเป็นอาร์เรย์
วิธี get() ช่วยให้คุณสามารถดึงค่าของคุณสมบัติและรับค่าเริ่มต้นหากไม่มีค่า นอกจากนี้ยังรองรับความลึกที่ระบุ . -
$ obj -> get ( ' books.0 ' ); // ArrayObject
$ obj -> get ( ' books.0.title ' ); // "1984"
$ obj -> get ( ' books.1.title ' ); // "Pride and Prejudice"
$ obj -> get ( ' books.0.missing ' , ' Default value ' ); // "Default value" นอกจากนี้คุณยังสามารถดึงคุณสมบัติโดยใช้ไวยากรณ์คุณสมบัติวัตถุ (เราโอเวอร์โหลด __get() เพื่อให้ได้สิ่งนี้):
$ obj -> books [ 0 ]; // ArrayObject
$ obj -> books [ 0 ]-> title ; // "1984"
$ obj -> books [ 1 ]-> title ; // "Pride and Prejudice"
$ obj -> books [ 0 ]-> missing ; // throws InvalidPropertyException เมื่อค่าที่ดึงผ่าน get('some.key') เป็นอาร์เรย์มันจะถูกบรรจุลงในอินสแตนซ์ของ ArrayObject อย่างไรก็ตามวิธี getRaw() ไม่ได้ดำเนินการ 'มวย' ใด ๆ ในค่าที่ส่งคืน
$ obj -> get ( ' books ' ); // ArrayObject
$ obj -> getRaw ( ' books ' ); // (array)
$ obj -> get ( ' books.0.title ' ); // "1984"
$ obj -> getRaw ( ' books.0.title ' ); // "1984" วิธี set() อนุญาตให้คุณตั้งค่าคุณสมบัติโดยใช้สัญลักษณ์ DOT มันจะสร้างโครงสร้างอาร์เรย์พื้นฐานโดยอัตโนมัติ:
$ obj -> set ( ' some.deep.key ' , $ value ); // Set nested property
$ obj -> set ( ' some_key ' , $ anotherArrayObject ); // Pass an ArrayObjectInterface as value เมื่อธง $onlyIfExists ถูกส่งผ่านเป็น true มันจะตั้งค่าคุณสมบัตินั้นหากคีย์มีอยู่แล้ว
คล้ายกับ get() แต่จะโยน InvalidPropertyException เมื่อไม่พบคีย์
เพื่อทดสอบการมีอยู่ขององค์ประกอบให้ใช้วิธีการ has() :
$ obj -> has ( ' books ' ); // true
$ obj -> has ( ' books.0.id ' ); // true
$ obj -> has ( ' books.1.name ' ); // false
$ obj -> has ( ' books.5 ' ); // false การวนลูปผ่านคอลเลกชันสามารถบรรลุได้โดยผ่านการโทรกลับไปยัง each() :
$ obj -> books -> each ( function ( $ book ) {
echo " ID: { $ book -> id } , title: { $ book -> title }n" ;
});
foreach ( $ obj -> books as $ book ) {
echo " ID: { $ book -> id } , title: { $ book -> title }n" ;
}หากคุณมีรายการเดียวมันก็ยังใช้งานได้
เนื่องจาก ArrayObject ใช้อินเทอร์เฟซตัววนซ้ำคุณจึงสามารถ foreach() ผ่านวัตถุได้ สิ่งนี้ใช้ได้กับรายการเดียวหรือคอลเลกชัน
foreach ( $ obj -> books as $ book ) {
echo " ID: { $ book -> id } , title: { $ book -> title }n" ;
}ส่งคืนคอลเลกชันใหม่ซึ่งมีคุณสมบัติที่ดึงออกมา
$ titles = $ obj -> books -> pluck ( ' title ' ); // ArrayObject
$ arr = $ titles -> toArray (); // ['1984', 'Pride and Prejudice'] ส่งคืนอาร์เรย์ใหม่ของทรัพย์สินที่ดึงออกมา สิ่งนี้ให้ทางลัดจาก pluck($key)->toArray() :
$ arr = $ obj -> books -> pluckArray ( ' title ' ); // ['1984', 'Pride and Prejudice'] คุณสามารถโทรออกนับโหนดใด ๆ :
$ obj -> count (); // 1
$ obj -> books -> count (); // 2
$ obj -> books [ 0 ]-> count (); // 1หมายเหตุ: เมื่อเรียกใช้รายการเดียว (เช่นไม่ใช่คอลเลกชัน) มันจะกลับมา 1
ส่งคืนจริงเมื่อคอลเลกชันมีอย่างน้อยหนึ่งรายการ
$ obj -> hasItems ();หมายเหตุ: เมื่อเรียกในรายการเดียว (เช่นไม่ใช่คอลเลกชัน) มันจะส่งคืนจริง
ใช้การโทรกลับหรืออาร์เรย์ของเงื่อนไข "โดยที่" และส่งคืนสินค้าที่ตรงกันเท่านั้น
การใช้การโทรกลับแต่ละรายการเป็นอินสแตนซ์ของ ArrayObject:
// Only return items with a title
$ filteredBooksWithTitle = $ obj -> books -> filter ( function ( $ book ) {
return $ book -> has ( ' title ' );
});นอกจากนี้คุณยังสามารถระบุรายการเงื่อนไขโดยใช้อาร์เรย์:
// Only return items with a title
$ filteredBooksWithTitle = $ obj -> books -> filter ([ " title " => ' 1984 ' ]); การรับอาร์เรย์ดั้งเดิมมีให้ผ่านวิธี toArray() :
$ obj -> books [ 0 ]-> toArray (); // [ 'id' => 1, 'title' => '1984', 'author' => 'George Orwell' ]
$ obj -> get ( 1 )-> toArray (); // [ 'id' => 2, 'title' => 'Pride and Prejudice', 'author' => 'Jane Austen' ]
$ obj -> books -> toArray (); // [ [ 'id' => 1, 'title' => '1984', 'author' => 'George Orwell' ], [ 'id' => 2, 'title' => 'Pride and Prejudice', 'author' => 'Jane Austen' ] ]
$ obj -> toArray (); // [ 'books' => [ [ 'id' => 1, 'title' => '1984', 'author' => 'George Orwell' ], [ 'id' => 2, 'title' => 'Pride and Prejudice', 'author' => 'Jane Austen' ] ] ] ส่งคืนสตริงที่เข้ารหัส JSON ของอาร์เรย์พื้นฐาน:
$ json = $ obj -> toJson (); // '{ "some_prop": [ "val1", "val2" ] }` กำหนดว่าอาร์เรย์พื้นฐานเป็นคอลเลกชันหรือไม่
$ obj -> books -> isCollection (); // true
$ obj -> get ( ' books.0 ' )-> isCollection (); // false
$ obj -> isCollection (); // false เพิ่มหนึ่งรายการขึ้นไปใน จุดเริ่มต้น ของคอลเลกชัน หากอาร์เรย์ไม่ได้เป็นคอลเลกชันมันจะถูกแปลงเป็นคอลเลกชันที่มีองค์ประกอบหนึ่ง
$ obj -> unshift ( ' value ' )
-> unshift ( ' value1 ' , ' value2 ' , ' value3 ' ); หมายเหตุ: คุณสามารถส่งผ่าน ArrayObject เป็นค่า
ดึงรายการ แรก ออกจากคอลเลกชัน
หากอาร์เรย์ไม่ได้เป็นคอลเลกชันมันจะถูกแปลงเป็นคอลเลกชันที่มีองค์ประกอบหนึ่ง
$ item = $ obj -> shift (); // ArrayObject เพิ่มหนึ่งรายการขึ้นไปใน ตอนท้าย ของคอลเลกชัน หากอาร์เรย์ไม่ได้เป็นคอลเลกชันมันจะถูกแปลงเป็นคอลเลกชันที่มีองค์ประกอบหนึ่ง
$ obj -> push ( ' value ' )
-> push ( ' value1 ' , ' value2 ' , ' value3 ' ); หมายเหตุ: คุณสามารถส่งผ่าน ArrayObject เป็นค่า
ดึงรายการ สุดท้าย ออกจากคอลเลกชัน
หากอาร์เรย์ไม่ได้เป็นคอลเลกชันมันจะถูกแปลงเป็นคอลเลกชันที่มีองค์ประกอบหนึ่ง
$ item = $ obj -> pop (); // ArrayObject ยินดีต้อนรับการมีส่วนร่วมโปรดส่งคำตอบแบบดึงหรือสร้างปัญหา รหัสที่ส่งของคุณควรจัดรูปแบบโดยใช้มาตรฐาน PSR-1/PSR-2