অ্যাক্সেস অ্যারে পিএইচপি মধ্যে একটি ফাংশন দ্বারা ফিরে


88

আমি একটি টেম্পলেট ইঞ্জিন ব্যবহার করছি যা আমার সাইটে যেখানে কোডটি সন্নিবেশ করানো হয়েছে সেখানে কোড প্রবেশ করায়।

আমি এমন কিছু যা যা খুব সহজ তা পরীক্ষা করার জন্য একটি ফাংশন লিখেছিলাম:

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

সমস্যাটি হ'ল - এই-> ডেটাটি ব্যক্তিগত, এবং আমি এটি সর্বত্র অ্যাক্সেস করতে পারি না, তাই আমাকে getData () ব্যবহার করতে হবে; যা আমার সমস্যা সৃষ্টি করে।

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

কাজ করে না, এবং প্রথমে মান নির্ধারণ করা হয় না কারণ এটি সরাসরি যদি একটি () ব্লকে ব্যবহৃত হবে।

কোন ধারনা?


রিটার্ন মান নির্ধারণ করা অবশ্যই কাজ করে এবং একমাত্র উপায়। আপনি কি আমাদের আপনার কর্মহীন কোডটি প্রদর্শন করতে পারেন?
এন্টি বীরণ্না

ভাল এটি কাজ করে না কারণ কোডটি যদি একটি (/ * কোড এখানে * /) sertedোকানো হবে। সুতরাং আমি আগে ডেটা বরাদ্দ করতে পারি না।
এনিও

4
পৃথিবীতে আপনি কীভাবে নির্মাণ করছেন? :) ইওল এর সাথে কিছু?
এন্টি বীরনা

আপনি কি পরীক্ষা করার চেষ্টা করছেন? অ্যারে উপাদান উপস্থিত রয়েছে এবং খালি-খালি মূল্য আছে কিনা তা দেখার চেষ্টা আপনি করেন? আপনি এর জন্য 'খালি' ফাংশনটি ব্যবহার করতে পারেন। এই প্রশ্নের আরও স্পষ্টতা প্রয়োজন!
txwikinger

আপনি কীভাবে myfunction()পুনরায় প্রক্রিয়াতে ফিরে এসেছিলেন সেই স্ট্রিংয়ের মানটি কীভাবে ছিল ? সেই অংশটি আপনার প্রশ্নে অনুপস্থিত।
hakre

উত্তর:


135

পিএইচপি 5.4 যেহেতু ঠিক এটি করা সম্ভব:

getSomeArray()[2]

তথ্যসূত্র: https://secure.php.net/manual/en/language.types.array.php#example-62

পিএইচপি 5.3 বা তার আগে, আপনাকে একটি অস্থায়ী পরিবর্তনশীল ব্যবহার করতে হবে।


4
আমি পেয়েছি PHP 5.4.11-1~precise+1এবং এই বৈশিষ্ট্যটি কাজ করে না! প্রতিক্রিয়া হিসাবে বার্তা পেয়েছেনParse error: syntax error, unexpected '['
ইউজিন

4
+ ইউজিন আপনি এটি কাজ করে পেয়েছেন? অন্যরাও একই সমস্যা অনুভব করতে পারে।
enyo

4
ফাংশন থেকে ফিরে অ্যারে স্বরলিপি সমর্থন করতে পিএইচপি 5.4 পর্যন্ত লেগেছিল ?! কি কদর্য বাগ।
বেসিল মুসা

এবং তারপরে আপনি অ্যারে_ ফিল্টার দ্বারা উত্পাদিত একটি অ্যারের প্রথম উপাদানটি পেতে এবং কাঁদতে শুরু করার চেষ্টা করেন
লুপ্যাক্স

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()পদ্ধতিটি কল করুন এবং তার রিটার্ন মানটি একটি অস্থায়ী ভেরিবলে সংরক্ষণ করুন
  • তারপরে, আপনার পরীক্ষার জন্য সেই অস্থায়ী পরিবর্তনশীলটি ব্যবহার করুন

আসলে এটি সম্পর্কে আপনার খুব বেশি পছন্দ নেই ...


ঠিক আছে, যেমন আমি বলেছি, আমার সমস্যাটি হ'ল এই কোডটি
sertedোকানো হয়

আপনি যদি বিবৃতিটির আগে পদ্ধতির কলটির ফলাফলটি একটি পরিবর্তনশীলকে অর্পণ করতে না পারেন, এবং if স্টেটমেন্ট থেকে সরাসরি পদ্ধতিটি কল করার চেষ্টা না করে, if স্টেটমেন্টে সেই পরিবর্তনশীলটি ব্যবহার করতে পারেন?
পাসক্ল মার্টিন

4
দুর্ভাগ্যক্রমে না ... এটি একটি টেম্পলেটিং ইঞ্জিন এবং এটিতে আমার কোনও নিয়ন্ত্রণ নেই।
enyo

12

ঠিক আছে ... আপাতদৃষ্টিতে এর চেয়ে ভাল উপায় আর নেই, তাই আমি নিজেকে একটি সুন্দর সমাধান না দিয়ে উত্তর দেব:

আমি ফাংশনটি তৈরি করেছি:

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

এবং এটি এর মতো ব্যবহার করেছেন:

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

এটি সুন্দর নয় তবে কাজ করে।


1

$this->dataএটি সর্বদা অ্যাক্সেসযোগ্য, যদি এটি সুরক্ষিত থাকে। সর্বত্র থেকে অ্যাক্সেসযোগ্য নয়, সুতরাং আপনি যদি আপনার কোডটিতে ফিরে আসছেন , এবং এটির যেমন মূল্যায়ন করা হয় তবে এটি ঠিক আছে।$object->data$this

বিটিডব্লিউ, আপনার কোডে একটি ত্রুটি রয়েছে: উদ্ধৃতিগুলি এড়ানো দরকার।

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

হ্যাঁ দুঃখিত ... আমি আমার পোস্ট সংশোধন করেছি: $ এই-> ডেটা অবশ্যই ব্যক্তিগত। বাগ তৈরি করার সময় আমার টাইপও সংশোধন করে।
এনিও

1

এটি পিএইচপি সংস্করণ 5.4 থেকে সম্ভব।

আপনি যদি এর জন্য অস্থায়ী পরিবর্তনশীল না চান এবং আপনার পিএইচপি সংস্করণ 5.4 এর চেয়ে কম, আপনি এখনও প্রথম বা শেষ উপাদানটি পেতে কিছু ফাংশনে অন্তর্নির্মিত ব্যবহার করতে পারেন:

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

সম্পাদনা: !!! দয়া করে মনে রাখবেন, পরবর্তী সংস্করণগুলিতে (5.4+) পিএইচপি একটি নোটিশ ফেলে দেবে, কারণ শেষটি কেবলমাত্র প্যারামিটার হিসাবে ভেরিয়েবলের প্রত্যাশা করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.