অ্যারেঅজেক্ট পিএইচপি 7.4 এ শেষ () দিয়ে কাজ করে না


9

পিএইচপি 7.4 মাইগ্রেট আমি মত কিছু অ্যারে ফাংশন একটি ভিন্ন আচরণ সঙ্গে মোকাবেলা করতে হবে reset(), current()বা end()ArrayObject বিষয়ে। নিম্নলিখিত উদাহরণটি বিভিন্ন আউটপুট উত্পাদন করে:

<?php

$array = new \ArrayObject(["a", "b"]);
$item = end($array);
var_dump($item);


$array = ["a", "b"];
$item = end($array);
var_dump($item);

সঙ্গে পিএইচপি 7.4 আউটপুট হল:

bool(false)
string(1) "b"

পিএইচপি সংস্করণে 7.4 এর আগে আউটপুটটি নিম্নোক্ত:

string(1) "b"
string(1) "b"

end($array->getArrayCopy())একটি নোটিশ উত্পন্ন করে তবে ভেরিয়েবলের সাথে ব্যবহার করা গেলে এটি কার্যকর হতে পারে।

end()একটি ArrayObjectবা এর সাথে আচরণ অনুকরণ করার উপায় আছে কি ArrayIterator? অ্যারেঅবজেক্টটি খুব বড় হতে পারে, শেষ পর্যন্ত একটি পুনরাবৃত্তি সবচেয়ে ভাল সমাধান নাও হতে পারে।


বিকল্প হতে পারে $item = $array[count($array)-1];। নিশ্চিত না যে এটিই সবচেয়ে কার্যকর সমাধান।
প্যাট্রিক কিউ

2
আমি বলব যে পিএইচপি বাগ হিসাবে যোগ্যতা অর্জন করবে,
চেঞ্জলগের

এটি অনলাইনে পরীক্ষা করুন: 3v4l.org/4MADI
প্রস্তর 0

1
@ পেট্রিক কিউ যদি সাহসী হয়?
আন্দ্রেয়াস

4
@ আইয়েন এটি অবশ্যই কোনও বাগ নয় - php.net/manual/en/…
u_mulder

উত্তর:


2

পিএইচপি 7.4 থেকে অ্যারে পদ্ধতিগুলি অভ্যন্তরীণ অ্যারেতে কাজ করে না, তবে ArrayObjectনিজেই। আমি এর জন্য দুটি সমাধানের সংক্ষিপ্তসার জানিয়েছি।

1. বস্তুর অভ্যন্তরীণ অ্যারে প্রাপ্তি।

$array = new \ArrayObject(["a", "b"]);
$item = end($array->getArrayCopy());

২.ArrayObject আপগ্রেড ক্লাসে কাস্টম মেথড এন্ড () ফেকড তৈরি করা এবং যুক্ত করা।


0

আপনি কীগুলি পেতে অ্যারেবজেক্টকে একটি অ্যারে তৈরি করতে পারেন তারপরে শেষ কীটি পেতে কীগুলির শেষ ব্যবহার করুন।

$array = new \ArrayObject(["a", "b"]);
$keys = array_keys((array)$array);
$end_key = end($keys);

var_dump($array[$end_key]);

এটি কোনও সুন্দর সমাধান নয় তবে এটি কাজ করে।
আমি আপনাকে এটি একটি ফাংশন করার পরামর্শ দিচ্ছি যাতে প্রয়োজন হলে আপনি এটি কল করতে পারেন।

https://3v4l.org/HTGYn

একটি ফাংশন হিসাবে:

function end_object($array){
    $keys = array_keys((array)$array);
    $end_key = end($keys);
    return $array[$end_key];
}


$array = new \ArrayObject(["a", "b"]);
$item = end_object($array);
var_dump($item);

আমি ফলাফল এবং প্রশ্নে usaqe তাকান যখন আমি উভয় উত্তর মধ্যে পার্থক্য দেখতে না। যদি পার্থক্য ব্যাখ্যা করুন দয়া করে
Dlk

1
আমি array_keys()সমাধানটি 3v4l.org/IaEMM/perf# আউটপুট দিয়ে পরীক্ষা করেছি তবে এটি end()একটি সহজ getArrayCopy() 3v4l.org/uYv59/perf#output এর
ট্রেন্ডফিশার

1
@ ট্রেন্ডফিশার যদি মেমোরিটি সমস্যা হয় এবং আপনি যদি endকেবলমাত্র ব্যবহার করতে চান তবে আপনি একটি র‌্যাপার ক্লাস তৈরি করতে পারেন যা প্রয়োগ করে ArrayAccessএবং একটি অতিরিক্ত ফাংশন রাখতে পারে যা endঅভ্যন্তরীণ প্রাইভেট অ্যারে চালিত করে returns
vivek_23

1
@ ভিভেক_23 ভাল উত্তর মত শোনাচ্ছে
ট্রেন্ডফিশার

3
প্রশ্ন: উদ্দেশ্য কী array_keys? কেন না আপনি শুধু এটা সরাসরি নিক্ষেপ করি $arr = (array) $arrayএবং তারপর$end = end($arr)
বৃষ্টি

0

Ingালাই বা একটি পুনরুক্তি ব্যবহার না করে কিছুটা দ্রুত পন্থাটি হ'ল প্রথমে কনস্ট্রাক্টরটি ব্যবহার না করা এবং তার পরিবর্তে appendএমন পদ্ধতি ব্যবহার করা হবে যা একটি অ্যারে নিজে তৈরি করবে এবং আপনি endপরে সেই অ্যারে ব্যবহার করতে পারবেন

$array = new \ArrayObject();
$array->append(["a", "b"]);
$item =  end($array[count($array) - 1]);
var_dump($item);

count($array) - 1আপনি যদি পরে অন্য অ্যারে সংযোজন করেন তবে আমরা নিশ্চিত হয়ে থাকি যে $itemসর্বদা সর্বশেষ যুক্ত হওয়া অ্যারেতে সর্বশেষ উপাদান।


1
ধন্যবাদ, এর সমাধানটি count()কিছু ক্ষেত্রে সহায়ক হতে পারে তবে আপনার উদাহরণটি এরকম new \ArrayObject([123 => "a", 456 => "c"]);
কোনও কিছুর

@ ট্রেন্ডফিশার আমি জানি যে কেন আমি appendনির্মাণকারীর পরিবর্তে ব্যবহার করেছি , আপনার উদাহরণের সাথে সংযোজন ব্যবহার করা অবশ্যই কাজ করবে। $array->append([123 => "a", 456 => "c"]
বৃষ্টি

@ ট্রেন্ডফিশার দয়া করে নোট করুন countআপনার অ্যারের উপাদানগুলির জন্য নয় এটি বহুমাত্রিক অ্যারে appendতৈরি করবে for আপনার অ্যারের জন্য আমরা endযথারীতি ব্যবহার করছি ।
বৃষ্টি

1
আমি অভিপ্রায়টির প্রশংসা করি, তবে আমি সাধারণত কোনও অ্যারের বিকল্প প্রতিস্থাপন হিসাবে একটি অ্যারেঅবজেক্ট ব্যবহার করি না। প্রশ্নের উদাহরণটি সমস্যাটি দেখানোর জন্য অনুকরণীয়। যদিও আমি যদি কেবলমাত্র ব্যবহার করি তবে আমি এটি ব্যবহার append()করতে পারি count()এটি বৈধ সমাধান। যে append('a')এবং সঙ্গে কাজ করতে পারে append('b')। মূলটি হ'ল এসোসিয়েটিভ অ্যারেগুলি অস্বীকার করা যা অ্যারেওজেক্টকে বাড়িয়ে দেওয়ার একটি সম্ভাবনা।
ট্রেন্ডফিশার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.