PHP में एक Array, नहीं Array के रूप में एक Array पास करना


148

मुझे याद है कि PHP में एक फ़ंक्शन के लिए तर्कों की एक सूची के रूप में एक सरणी को पारित करने का एक तरीका है, सरणी को मानक func($arg1, $arg2)तरीके से dereferencing करना । लेकिन अब मैं इसे करने के तरीके पर खो गया हूं। मैं संदर्भ से गुजरने के तरीके को याद करता हूं, आने वाले मापदंडों को "ग्लोब" कैसे करें ... लेकिन सरणी को तर्कों की सूची में डी-लिस्ट कैसे करें।

यह उतना ही सरल हो सकता है func(&$myArgs), लेकिन मुझे पूरा यकीन है कि यह नहीं है। लेकिन, दुख की बात है कि php.net मैनुअल ने अब तक कुछ भी नहीं बताया है। ऐसा नहीं है कि मुझे पिछले वर्ष के लिए इस विशेष सुविधा का उपयोग करना पड़ा है।

जवाबों:


178

1
मैं शपथ ले सकता था कि यह एक गैर-फ़ंक्शन भी था, जैसे कि उपसर्ग चरित्र या कुछ और। धन्यवाद।
रॉबर्ट के

8
लेकिन मैं अजगर को नहीं जानता! मुझे अकस्मात मानसिक होना चाहिए ...: D
रॉबर्ट के

45
तर्क अनपैकिंग, जैसा कि कहा जाता है, PHP 5.6 ( wiki.php.net/rfc/argument_unpacking ) में जोड़ा जाएगा । यह 'स्प्लट ऑपरेटर': '...' का उपयोग करेगा। इसका वाक्य विन्यास: $args = [1,2,3]; function(...$args){}
arothuis

4
लेकिन क्या होगा यदि आप जिस फ़ंक्शन को कॉल करना चाहते हैं वह एक ऑब्जेक्ट पर एक इंस्टेंस विधि है, वैश्विक स्थान में फ़ंक्शन नाम नहीं?
अहानिबेक्स्ड

6
@ahnbizcad तो आपको एक का उपयोग करना चाहिए callable, जो उसी का उपयोग करता है call_user_func_array, केवल सरणी के साथ जहां पहला तत्व ऑब्जेक्ट है, और दूसरा तरीका है। उदाहरण के लिएcall_user_func_array([$object, 'method'], $myArgs);
स्टीव एनबी

149

जैसा कि उल्लेख किया गया है , PHP 5.6+ के रूप में आप आसानी से तर्कों की एक सरणी के साथ एक फ़ंक्शन को कॉल करने के लिए ...टोकन (उर्फ " स्प्लैट ऑपरेटर", वैरेडिक फ़ंक्शन कार्यक्षमता का हिस्सा ) का उपयोग कर सकते हैं (चाहिए!) :

<?php
function variadic($arg1, $arg2)
{
    // Do stuff
    echo $arg1.' '.$arg2;
}

$array = ['Hello', 'World'];

// 'Splat' the $array in the function call
variadic(...$array);

// 'Hello World'

नोट: सरणी आइटम को उनकी स्थिति में नहीं, सरणी में उनकी स्थिति के तर्क से मैप किया जाता है

कार्लोसकार्सी की टिप्पणी के अनुसार , सभी मामलों में अब तक अनपैकिंग का यह तरीका सबसे तेज़ तरीका है । कुछ तुलनाओं में, यह 5 गुना से अधिक तेज है call_user_func_array

अलग

क्योंकि मुझे लगता है कि यह वास्तव में उपयोगी है (हालांकि सीधे सवाल से संबंधित नहीं है): आप अपने फ़ंक्शन की परिभाषा में स्पैट ऑपरेटर पैरामीटर को टाइप-हिंट कर सकते हैं ताकि यह सुनिश्चित हो सके कि सभी पारित मूल्य एक विशिष्ट प्रकार से मेल खाते हैं।

(बस याद रखें कि ऐसा करना आपके द्वारा परिभाषित अंतिम पैरामीटर होना चाहिए और यह फ़ंक्शन में दिए गए सभी मापदंडों को बंडल करता है।)

यह सुनिश्चित करने के लिए बहुत अच्छा है कि किसी सरणी में किसी विशिष्ट प्रकार के आइटम हैं:

<?php

// Define the function...

function variadic($var, SomeClass ...$items)
{
    // $items will be an array of objects of type `SomeClass`
}

// Then you can call...

variadic('Hello', new SomeClass, new SomeClass);

// or even splat both ways

$items = [
    new SomeClass,
    new SomeClass,
];

variadic('Hello', ...$items);

7
यह एक महान प्रदर्शन में सुधार है call_user_func_array। तो अगर आप php 5.6+ का उपयोग कर रहे हैं तो मैं इसे सुझाऊंगा। यहाँ एक परीक्षण है , जो आधिकारिक php विकि
कार्लोसकारुस

2
यह वास्तव में दुर्भाग्यपूर्ण है यह चिह्नित उत्तर नहीं है। निश्चित रूप से बेहतर तरीके से
unforgiven1987

81

यह भी ध्यान दें कि यदि आप किसी सरणी में एक इंस्टेंस विधि लागू करना चाहते हैं, तो आपको फ़ंक्शन को पास करना होगा:

call_user_func_array(array($instance, "MethodName"), $myArgs);

4
@understack लिंक किए गए पृष्ठ$foo->bar() पर उदाहरण बताता है कि यह होना चाहिए । array($instance, "MethodName")
बजे पॉल कैलक्राफ्ट

11
बहुत बढ़िया, मैंने इसका इस्तेमाल एक बच्चे की कक्षा में निर्माण संबंधी तर्कों की नकल करने से बचने के लिए किया :)call_user_func_array(array(parent, "__construct"), func_get_args());
जेसन

10

पूर्णता के लिए, PHP 5.1 के रूप में यह काम करता है:

<?php
function title($title, $name) {
    return sprintf("%s. %s\r\n", $title, $name);
}
$function = new ReflectionFunction('title');
$myArray = array('Dr', 'Phil');
echo $function->invokeArgs($myArray);  // prints "Dr. Phil"
?>

देखें: http://php.net/reflectionfunction.invokeargs

तरीकों के लिए आप ReflectionMethod :: invokeArgs का उपयोग करें और ऑब्जेक्ट को पहले पैरामीटर के रूप में पास करें।


यह वास्तव में मैं क्या देख रहा था!
Dejv
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.