เข้าถึงอาร์เรย์ที่ส่งคืนโดยฟังก์ชันใน php


88

ฉันใช้เทมเพลตเอนจิ้นที่แทรกโค้ดในไซต์ของฉันในที่ที่ฉันต้องการ

ฉันเขียนฟังก์ชันเพื่อทดสอบบางสิ่งซึ่งค่อนข้างง่าย:

myfunction() { return '($this->data["a"]["b"] ? true : false)'; }

ปัญหาคือ $ this-> data เป็นข้อมูลส่วนตัวและฉันไม่สามารถเข้าถึงได้ทุกที่ดังนั้นฉันจึงต้องใช้ getData (); ซึ่งทำให้เกิดปัญหาของฉัน

$this->getData()['a']['b']

ไม่ได้ผลและการกำหนดค่าก่อนไม่ได้เช่นกันเนื่องจากจะถูกใช้โดยตรงในบล็อก if ()

ความคิดใด ๆ ?


การกำหนดมูลค่าส่งคืนได้ผลแน่นอนและเป็นวิธีเดียว คุณสามารถแสดงรหัสที่ไม่ทำงานของคุณให้เราทราบได้หรือไม่?
Anti Veeranna

มันใช้งานไม่ได้เพราะโค้ดจะถูกแทรกใน if (/ * code here * /) ดังนั้นฉันจึงไม่สามารถกำหนดข้อมูลก่อนหน้านี้ได้
enyo

1
คุณกำลังสร้างอะไรบนโลกนี้? :) อะไรกับ eval?
Anti Veeranna

คุณกำลังพยายามตรวจสอบอะไร คุณลองดูว่าองค์ประกอบอาร์เรย์มีอยู่และมีค่าไม่ว่างเปล่าหรือไม่? คุณสามารถใช้ฟังก์ชัน 'ว่าง' สำหรับสิ่งนี้ คำถามนี้ต้องการความชัดเจนมากขึ้น!
txwikinger

ค่าสตริงที่คุณส่งคืนในการmyfunction()ประมวลผลเพิ่มเติมเป็นอย่างไร ส่วนนั้นขาดหายไปในคำถามของคุณ
hakre

คำตอบ:


135

เนื่องจาก PHP 5.4 เป็นไปได้ที่จะทำเช่นนั้น:

getSomeArray()[2]

อ้างอิง: https://secure.php.net/manual/en/language.types.array.php#example-62

ใน PHP 5.3 ขึ้นไปคุณจะต้องใช้ตัวแปรชั่วคราว


4
ฉันมีPHP 5.4.11-1~precise+1และฟีเจอร์นี้ใช้ไม่ได้! ได้รับข้อความตอบกลับParse error: syntax error, unexpected '['
ยูจีน

1
+ ยูจีนได้ผลหรือไม่? บางทีคนอื่นอาจประสบปัญหาเดียวกัน
enyo

2
ใช้เวลาจนถึง php 5.4 เพื่อรองรับสัญกรณ์อาร์เรย์ที่ส่งคืนจากฟังก์ชัน?! ช่างเป็นจุดบกพร่องที่น่ารังเกียจ
Basil Musa

จากนั้นคุณพยายามรับองค์ประกอบแรกของอาร์เรย์ที่สร้างโดย array_filter และเริ่มร้องไห้
Loupax

18

คุณไม่สามารถใช้สิ่งนี้ได้:

$this->getData()['a']['b']

กล่าวคือไวยากรณ์การเข้าถึงอาร์เรย์ไม่สามารถทำได้โดยตรงในการเรียกใช้ฟังก์ชัน

คุณต้องใช้ตัวแปรชั่วคราวดังนี้:

$tmp = $this->getData();
$tmp['a']['b']    // use $tmp, now

ในกรณีของคุณนี่อาจหมายถึงการใช้สิ่งนี้:

function myfunction() {
  $tmp = $this->getData();
  return ($tmp['a']['b'] ? true : false);
}

คุณต้อง:

  • ขั้นแรกให้เรียกgetData()ใช้เมธอดของคุณและเก็บค่าที่ส่งคืนไว้ในตัวแปรชั่วคราว
  • จากนั้นใช้ตัวแปรชั่วคราวนั้นสำหรับการทดสอบของคุณ

คุณไม่มีทางเลือกมากนักจริงๆแล้ว ...


อย่างที่ฉันพูดไปปัญหาของฉันคือรหัสนี้ถูกแทรกโดยตรงในถ้า (/ * code ไปที่นี่ * /) ดังนั้นการกำหนดฟังก์ชันจึงเป็นไปไม่ได้จริงๆ ...
enyo

คุณไม่สามารถกำหนดผลลัพธ์ของการเรียกใช้เมธอดให้กับตัวแปรก่อนคำสั่ง if และใช้ตัวแปรนั้นในคำสั่ง if แทนการพยายามเรียก method จากคำสั่ง if โดยตรงได้หรือไม่?
Pascal MARTIN

1
น่าเสียดายที่ไม่ใช่ ... นี่เป็นเครื่องมือสร้างเทมเพลตและฉันไม่สามารถควบคุมมันได้
enyo

12

โอเค ... เห็นได้ชัดว่าไม่มีวิธีที่ดีกว่านี้จริงๆดังนั้นฉันจะตอบตัวเองด้วยวิธีแก้ปัญหาที่ไม่สวยงามนัก:

ฉันสร้างฟังก์ชัน:

arrayGet($array, $index) { return $array[$index]; }

และใช้มันดังนี้:

myfunction() { return '(arrayGet(arrayGet($this, "a"), "b") ? true : false)' }

ไม่สวย แต่ใช้งานได้


1

$this->dataคือมักจะเข้าถึงได้ถ้ามันได้รับการคุ้มครอง ไม่สามารถเข้าถึงได้จากทุกที่ดังนั้นหากคุณส่งคืนรหัสของคุณและได้รับการประเมินเช่นนี้ก็น่าจะใช้ได้$object->data$this

Btw มีข้อผิดพลาดในรหัสของคุณ: คำพูดที่ต้องหลีกเลี่ยง

myfunction() { return '($this->data[\'a\'][\'b\'] ? true : false)'; }

ขออภัย ... ฉันแก้ไขโพสต์ของฉันแล้ว: $ this-> data เป็นส่วนตัวแน่นอน แก้ไขข้อผิดพลาดของฉันเมื่อสร้างข้อบกพร่องด้วย
enyo

1

เป็นไปได้จาก PHP เวอร์ชัน 5.4

หากคุณไม่ต้องการตัวแปรชั่วคราวสำหรับสิ่งนั้นและเวอร์ชัน PHP ของคุณน้อยกว่า 5.4ซึ่งคุณยังสามารถใช้ฟังก์ชันในตัวเพื่อรับองค์ประกอบแรกหรือองค์ประกอบสุดท้าย:

$x     = 'first?last';
$first = array_shift(explode('?', $x));
$last  = end(explode('?', $x));
$last2 = array_pop(explode('?', $x));

แก้ไข: !!! โปรดทราบว่าในเวอร์ชันที่ใหม่กว่า (5.4+) PHP จะแจ้งให้ทราบล่วงหน้าเนื่องจากท้ายที่สุดคาดว่าตัวแปรเป็นพารามิเตอร์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.