PHP 7.4 में ArrayObject अंत () के साथ काम नहीं करता है


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);

साथ php 7.4 उत्पादन होता है:

bool(false)
string(1) "b"

7.4 से पहले PHP संस्करण पर आउटपुट निम्न है:

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

एक end($array->getArrayCopy())नोटिस का उत्पादन करता है, लेकिन अगर एक चर के साथ प्रयोग किया जाता है तो यह एक समाधान हो सकता है।

वहाँ एक या के end()साथ व्यवहार का अनुकरण करने के लिए एक रास्ता है ? ArrayObject बहुत बड़ा हो सकता है, अंत तक एक पुनरावृत्ति सबसे अच्छा समाधान नहीं हो सकता है।ArrayObjectArrayIterator


एक विकल्प हो सकता है $item = $array[count($array)-1];। यकीन नहीं तो सबसे कारगर उपाय है।
पैट्रिक क्यू

2
मैं एक PHP बग के रूप में है कि पात्र कहेंगे, वहाँ निश्चित रूप से बदलाव का में कुछ भी नहीं है कि सुझाव है कि इस में 7.4 एक इरादा परिवर्तन किया गया है
iainn

इसे ऑनलाइन टेस्ट करें: 3v4l.org/4MADI
0stone0

1
@PatrickQ क्या है अगर यह साहचर्य है?
एंड्रियास

4
@ आईने यह निश्चित रूप से बग नहीं है - php.net/manual/en/…
u_mulder

जवाबों:


2

से पीएचपी 7.4 सरणी तरीकों आंतरिक सरणी पर काम नहीं है, लेकिन पर ArrayObjectही। मैंने उसके लिए दो समाधान प्रस्तुत किए।

1. वस्तु का आंतरिक सरणी प्राप्त करना।

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

2.ArrayObject उन्नत कक्षा में कस्टम विधि के अंत () को जोड़ना और बनाना ।


0

आप कुंजियों को प्राप्त करने के लिए arrayobject को बना सकते हैं और अंतिम कुंजी प्राप्त करने के लिए कुंजियों पर अंत का उपयोग कर सकते हैं।

$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
मैंने 3v4l.org/IaEMM/perf#output केarray_keys() साथ समाधान का परीक्षण किया है, लेकिन इसे एक साधारण 3v4l.org/uYv59/perf#outputend()getArrayCopy()
Trendfisout

1
@Trendfischer यदि मेमोरी समस्या है और यदि आप endकेवल उपयोग करना चाहते हैं , तो आप एक रैपर क्लास बना सकते हैं जो लागू होता है ArrayAccessऔर एक अतिरिक्त फ़ंक्शन होता है जो endसंचालित होने वाले आंतरिक निजी सरणी का रिटर्न देता है।
vivek_23

1
@ vivek_23 एक अच्छे उत्तर की तरह लगता है
Trendfischer

3
प्रश्न: इसका उद्देश्य क्या है array_keys? क्यों नहीं आप तो बस उसे सीधे डाली है $arr = (array) $arrayऔर फिर$end = end($arr)
बारिश

0

कास्टिंग के बिना या इट्रेटर का उपयोग किए बिना थोड़ा तेज़ तरीका यह होगा कि आप पहली बार में कंस्ट्रक्टर का उपयोग न करें, और इसके बजाय 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"]);
ट्रेंडफिशर

@ Trendfischer मुझे पता है कि इसीलिए मैंने appendकंस्ट्रक्टर के बजाय उपयोग किया, आपके उदाहरण के साथ ऐपेंड का उपयोग करना निश्चित रूप से काम करेगा। $array->append([123 => "a", 456 => "c"]
बारिश

@Trendfischer कृपया ध्यान दें countकि appendयह आपके द्वारा बनाए गए बहुआयामी सरणी के लिए आपके सरणी के तत्वों के लिए नहीं है । आपके सरणी के लिए हम endहमेशा की तरह उपयोग कर रहे हैं ।
बारिश

1
मैं इरादे की सराहना करता हूं, लेकिन मैं आमतौर पर एक सरणी के लिए एक साधारण प्रतिस्थापन के रूप में एक ArrayObject का उपयोग नहीं करता हूं। प्रश्न में उदाहरण समस्या को दिखाने के लिए अनुकरणीय है। यद्यपि यदि मैं केवल उपयोग करता append()हूं, तो मैं एक का उपयोग कर सकता हूं count(), वह वैध समाधान है। के साथ काम कर सकता है append('a')और append('b')। प्रमुख सहयोगी सरणियों को अस्वीकार करना होगा जो कि ArrayObject का विस्तार करके एक संभावना है।
ट्रेंडफिशर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.