PHP के लिए Coalesce फ़ंक्शन?


131

कई प्रोग्रामिंग भाषाओं में एक सहक्रियाशील फ़ंक्शन होता है (पहला गैर-पूर्ण मान लौटाता है, उदाहरण )। PHP, दुख की बात है कि 2009 में, नहीं।

PHP में एक को लागू करने का एक अच्छा तरीका क्या होगा जब तक कि PHP खुद एक कोलेसस फ़ंक्शन नहीं करता है?


11
संबंधित: PHP 7 के लिए नया अशक्त coalescing संचालक ??
kojiro

अशक्त मोटे ऑपरेटर के बारे में अधिक जानकारी यहाँ पाई जा सकती है - stackoverflow.com/questions/33666256/…
पीटर

1
नोट करने के लिए बस, PHP7 इस fucntion लागू
Grzegorz

@Grzegorz: एक ऑपरेटर एक फ़ंक्शन नहीं है, या आपने PHP 7 में उस फ़ंक्शन को कहां पाया है?)
hakre

फ़ंक्शन द्वारा मैं फ़ंक्शन का मतलब नहीं था;) फ़ीचर। मैं सटीक नहीं था। धन्यवाद :)
ग्रेजेगोरज़

जवाबों:


194

Php 5.3 में एक नया ऑपरेटर है जो यह करता है: ?:

// A
echo 'A' ?: 'B';

// B
echo '' ?: 'B';

// B
echo false ?: 'B';

// B
echo null ?: 'B';

स्रोत: http://www.php.net/ChangeLog-5.php#5.3.0


25
कई टर्नरी शॉर्टकट के बारे में, कुछ ऐसा होगा जैसे "गूंज $ ए ?: $ बी ?: $ सी ?: $ डी।" काम?
क्रिस आर

5
सरणियों के लिए अपेक्षित रूप से काम नहीं करता है। उदाहरण के लिए, जब यह जांचने की कोशिश की जा रही है कि अपरिभाषित सरणी तत्व गलत है या नहीं, तो त्रुटि होगी। $input['properties']['range_low'] ?: '?'
कीयो

5
आप को मोटे ऑपरेटर के उपयोग के बावजूद एक अपरिभाषित सूचकांक सूचना मिलनी चाहिए।
केविन

2
एकाधिक फ़र्ज़ी तर्क अंतिम तर्क देते हैं, array() ?: null ?: falseरिटर्न करते हैं false। ऑपरेटर वास्तव में समझदार है।
ब्रैड कोच

6
ध्यान रखें कि यह अन्य भाषाओं में केवल गैर-अशांति की तरह स्वीकार नहीं करता है, लेकिन कोई भी मूल्य, जो एक बूलियन में बदल जाएगा। तो सुनिश्चित करें कि आप अपने प्रकार के कास्टिंग नियमों
दानमैन

65

PHP 7 ने एक वास्तविक मोटे ऑपरेटर की शुरुआत की :

echo $_GET['doesNotExist'] ?? 'fallback'; // prints 'fallback'

यदि मान ??मौजूद नहीं है या लिया nullजाने के बाद मान ??है।

उल्लिखित ?:ऑपरेटर पर सुधार ??यह है कि, बिना फेंक दिए अपरिभाषित चर भी संभालता है E_NOTICE


अंत में कोई और अधिक परेशान () और खाली () सभी जगह नहीं है!
जॉर्ज कगन

7
@ टाइम नोमाड आपको अभी भी खाली है, यह केवल शून्य के लिए जाँच करता है
नबील खान

सुरक्षित "फाल्सी-कोलेसस" प्राप्त करने का एकमात्र तरीका दोनों का थोड़ा सा उपयोग करना है:($_GET['doesNotExist'] ?? null) ?: 'fallback'
नाथन बाल्च

का लाभ ?:अधिक ??, तथापि, कि यह अच्छी तरह से जो के रूप में खाली मान coalesces है ??नहीं करता है। तार्किक या जावास्क्रिप्ट (यानी में ऑपरेटर के व्यवहार के समान $val || 'default'), मैं पाते हैं ?:की एक और अधिक व्यावहारिक रूप होने वालों हमारे व्यवहार में अगर हम अंत में खुद को संभालने दोनों को खोजने के खाली और अशक्त उसी तरह (यानी में $val ?: 'default')। और अगर आप इस मुद्दे को और ज़ोर देना चाहते हैं E_NOTICE, तो आप इस पर भी बहस कर सकते हैं:echo @$val ?: 'default';
मैट बोर्जा

29

पहले गूगल पर "php coalesce" के लिए हिट।

function coalesce() {
  $args = func_get_args();
  foreach ($args as $arg) {
    if (!empty($arg)) {
      return $arg;
    }
  }
  return NULL;
}

http://drupial.com/content/php-coalesce


9
एक छोटे से राम को सहेजें और एक सरणी में डुप्लिकेट को डुप्लिकेट न करें, बस foreach (func_get_args () $ arg) {}
ट्रैविसो

17
@ [अल्फ्रेड, सियारन] - आप गलत हैं। foreach () केवल एक बार एक सरणी प्राप्त करने के लिए पहले तर्क का मूल्यांकन करता है, और फिर उस पर पुनरावृत्ति करता है।
गहोआ

6
फ़ॉर्च के अंदर func_get_args () डालना (यहां $ arg के रूप में) प्रदर्शन के दृष्टिकोण से कुछ भी नहीं बदलेगा।
सेवेजमैन

7
@ सावेजमैन ... बिल्कुल ... यदि आप अपने प्रदर्शन के इस मिलिसेकंड या कुछ बाइट्स मेमोरी से निचोड़ने की सोच रहे हैं, तो शायद आप गलत प्रदर्शन / मेमोरी टोंटी देख रहे हैं
क्रिस 13

4
विडंबना यह है कि यह अब Google पर "php coalesce" के लिए पहली हिट है।
शेवर

18

मुझे वास्तव में पसंद है ?: ऑपरेटर। दुर्भाग्य से, यह अभी तक मेरे उत्पादन वातावरण पर लागू नहीं हुआ है। इसलिए मैं इसके बराबर का उपयोग करता हूं:

function coalesce() {
  return array_shift(array_filter(func_get_args()));
}

1
यह एक 'सच्चाई' है, जो किसी भी चीज़ से छुटकारा पाने के लिए array_filter का उपयोग करते हैं, जो पास किए गए n तर्क में झूठे (अशक्त सहित) का मूल्यांकन करता है। मेरा अनुमान है कि सरणी में पहले तत्व के बजाय शिफ्ट का उपयोग करना किसी तरह अधिक मजबूत है, लेकिन वह मैं नहीं जानता। देखें: php.net/manual/en/…
एडम

3
मुझे यह पसंद है लेकिन @hakre से सहमत coalesceहोना चाहिए - पहले गैर-शून्य तर्क को वापस करना है जो इसका सामना करता है, जिसमें शामिल होगा FALSE। यह फ़ंक्शन FALSEहालांकि त्याग देगा , शायद ऐसा नहीं है कि ऑप को ध्यान में रखा गया हो (कम से कम वह नहीं जो मैं किसी coalesceफ़ंक्शन से बाहर चाहता हूं )।
मैडब्रेक्स

1
केवल चर को संदर्भ द्वारा पारित किया जाना चाहिए
बेन सिंक्लेयर

9

यह ध्यान देने योग्य है कि PHP के बिना वैरिएबल चर और सरणी सूचकांकों के उपचार के कारण, किसी भी प्रकार के मोटे फ़ंक्शन सीमित उपयोग के हैं। मैं ऐसा करने में सक्षम होना पसंद करूंगा:

$id = coalesce($_GET['id'], $_SESSION['id'], null);

लेकिन यह, ज्यादातर मामलों में, एक E_NOTICE के साथ PHP को त्रुटि का कारण बना देगा। इसका उपयोग करने से पहले एक चर के अस्तित्व का परीक्षण करने का एकमात्र सुरक्षित तरीका है कि इसे सीधे खाली () या isset () में उपयोग करें। केविन द्वारा सुझाए गए टर्नरी ऑपरेटर सबसे अच्छा विकल्प है यदि आप जानते हैं कि आपके कोलेस में सभी विकल्पों को प्रारंभिक रूप से जाना जाता है।


इस मामले में, सरणी यूनियन बहुत अच्छी तरह से काम करती हैं ( $getstuff = $_GET+$_SESSION+array('id'=>null);$id=$getstuff['id'];)।
ब्रिलिएंड

@ क्या मतलब है? क्या आपने सुझाए गए समाधान को संदर्भ के साथ रखा?
बेन सिंक्लेयर

PHP 7 बहुत ही सामान्य ऑपरेशन को और अधिक संक्षिप्त बनाने के लिए प्यारे नए isset ternary ऑपरेटर ??का परिचय देता है ।
बोटीमर

6

सुनिश्चित करें कि आप इस प्रकार की पहचान करना चाहते हैं कि आप इस फ़ंक्शन को कुछ प्रकार के साथ कैसे काम करना चाहते हैं। PHP में विभिन्न प्रकार की जाँच या समान कार्य होते हैं, इसलिए सुनिश्चित करें कि आप जानते हैं कि वे कैसे काम करते हैं। यह is_null () और रिक्त () की तुलना का एक उदाहरण है

$testData = array(
  'FALSE'   => FALSE
  ,'0'      => 0
  ,'"0"'    => "0"  
  ,'NULL'   => NULL
  ,'array()'=> array()
  ,'new stdClass()' => new stdClass()
  ,'$undef' => $undef
);

foreach ( $testData as $key => $var )
{
  echo "$key " . (( empty( $var ) ) ? 'is' : 'is not') . " empty<br>";
  echo "$key " . (( is_null( $var ) ) ? 'is' : 'is not')  . " null<br>";
  echo '<hr>';
}

जैसा कि आप देख सकते हैं, खाली () इन सभी के लिए सही है, लेकिन is_null () केवल उनमें से 2 के लिए ऐसा करता है।


2

मैं एतान केंट द्वारा पोस्ट किए गए उत्तर पर विस्तार कर रहा हूं । यह उत्तर गैर-अशक्त तर्कों को छोड़ देगा जो कि array_filter के आंतरिक कामकाज के कारण झूठे का मूल्यांकन करते हैं , जो कि coalesceआमतौर पर एक फ़ंक्शन नहीं करता है। उदाहरण के लिए:

echo 42 === coalesce(null, 0, 42) ? 'Oops' : 'Hooray';

उफ़

इसे दूर करने के लिए, एक दूसरे तर्क और फ़ंक्शन परिभाषा की आवश्यकता होती है। प्रतिदेय समारोह बताने के लिए जिम्मेदार है array_filterया नहीं, परिणाम सरणी के लिए वर्तमान सरणी मान जोड़ने के लिए:

// "callable"
function not_null($i){
    return !is_null($i);  // strictly non-null, 'isset' possibly not as much
}

function coalesce(){
    // pass callable to array_filter
    return array_shift(array_filter(func_get_args(), 'not_null'));
}

यह अच्छा होगा यदि आप बस 2 तर्क के रूप में पास issetया पास कर सकते हैं , लेकिन ऐसा कोई भाग्य नहीं है।'isset'array_filter


0

मैं वर्तमान में इसका उपयोग कर रहा हूं, लेकिन मुझे आश्चर्य है कि अगर यह PHP 5 में कुछ नई सुविधाओं के साथ सुधार नहीं किया जा सकता है।

function coalesce() {
  $args = func_get_args();
  foreach ($args as $arg) {
    if (!empty($arg)) {
    return $arg;
    }
  }
  return $args[0];
}

0

PHP 5.3+, बंद होने के साथ:

function coalesce()
{
    return array_shift(array_filter(func_get_args(), function ($value) {
        return !is_null($value);
    }));
}

डेमो: https://eval.in/187365


केवल चर संदर्भ द्वारा पारित किया जाना चाहिए
बेन सिनक्लेयर

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