পিএইচপি জন্য কোলেসেস ফাংশন?


131

অনেক প্রোগ্রামিং ল্যাঙ্গুয়েজে কোয়েলেসেস ফাংশন থাকে (প্রথম নন-নুল মান, উদাহরণ প্রদান করে )। পিএইচপি, দুঃখজনকভাবে 2009 সালে, না।

পিএইচপি নিজেই একটি coalesce ফাংশন না পাওয়া পর্যন্ত পিএইচপি মধ্যে একটি বাস্তবায়ন করার ভাল উপায় কি হবে?


11
সম্পর্কিত: পিএইচপি 7 এর জন্য নতুন নাল ??
কোলেসিং

নাল কোলেস অপারেটর সম্পর্কে আরও তথ্য এখানে পাওয়া যাবে - stackoverflow.com/questions/33666256/…
পিটার

1
টীকাগুলি এতে শুধু PHP7 এই fucntion বাস্তবায়িত
Grzegorz

@ গ্রজেগোর্জ: অপারেটর কোনও ফাংশন নয়, বা পিএইচপি 7-তে আপনি কোথায় সেই ফাংশনটি নতুন পেয়েছেন?)
হ্যাক্রে

ফাংশন দ্বারা আমি ফাংশন মানে না;) বৈশিষ্ট্য। আমি সুনির্দিষ্ট ছিল না। আপনাকে ধন্যবাদ :)
গ্রজেগোর্জ

উত্তর:


194

পিএইচপি 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
একাধিক ত্রৈমাসিক শর্টকাটগুলির কী, "ইকো $ এ?: $ বি?: $ সি?: $ D;" এর মতো কিছু হবে? কাজ করে?
ক্রিসআর

5
অ্যারেগুলির জন্য প্রত্যাশার মতো কাজ করে না। উদাহরণস্বরূপ যখন কোনও অপরিজ্ঞিত অ্যারে উপাদানটি মিথ্যা কিনা তা পরীক্ষা করার চেষ্টা করার সময় একটি ত্রুটি ঘটবে। $input['properties']['range_low'] ?: '?'
কিও

5
Coalesce অপারেটর ব্যবহার নির্বিশেষে আপনার একটি অপরিজ্ঞাত সূচক বিজ্ঞপ্তি পাওয়া উচিত।
কেভিন

2
একাধিক ভুয়া আর্গুমেন্ট শেষ যুক্তি array() ?: null ?: falseফিরিয়ে দেয় , ফেরত দেয় false। অপারেটর সত্যই বুদ্ধিমান।
ব্র্যাড কোচ

6
মনে রাখবেন যে এটি কেবল অন্য ভাষায় কোলসির মতো অ-নালকে গ্রহণ করে না, তবে কোনও মান, যা স্পষ্টভাবে একটি বুলিয়ানে রূপান্তরিত হবে। সুতরাং নিশ্চিত হয়ে নিন যে আপনি নিজের ধরণের কাস্টিং বিধিগুলি
ড্যানম্যান

65

পিএইচপি 7 একটি বাস্তব coalesce অপারেটর প্রবর্তিত :

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

মানটি যদি ??বিদ্যমান না থাকে বা নেওয়া nullহওয়ার পরে মান ??হয়।

উল্লিখিত ?:অপারেটরের উপর উন্নতি হ'ল ??এটি একটি নিক্ষেপ ছাড়াই অপরিজ্ঞাত ভেরিয়েবলগুলি পরিচালনা করে E_NOTICE


অবশেষে পুরো জায়গা জুড়ে আর কোনও সেট () এবং খালি () নেই!
জর্জ কাগান

7
@ টাইম নোমাদ আপনার এখনও প্রয়োজন খালি, এটি কেবল শূন্যের জন্য যাচাই করে
নাবিল খান

নিরাপদ "মিথ্যা-কোলেসেস" পাওয়ার একমাত্র উপায় হ'ল উভয়কেই ব্যবহার করা:($_GET['doesNotExist'] ?? null) ?: 'fallback'
নাথান বাউলচ

?:ওভারের সুবিধাটি ??হ'ল এটি খালি মানগুলিকেও coalesces যা ??না করে। জাভাস্ক্রিপ্টে লজিক্যাল ওআর অপারেটরের আচরণের মতো (অর্থাত্ $val || 'default'), আমি যদি অনুশীলন করে চূড়ান্তভাবে নিজেকে একইভাবে খালি এবং নাল উভয়ভাবে পরিচালনা করি তবে (যেমন ) কোলেসিংয়ের?: আরও ব্যবহারিক রূপ বলে মনে করব । এবং যদি আপনি বিষয়টি আরও জোর করে চাপতে চান এবং গিলে ফেলতে চান তবে আপনি এটির পক্ষেও তর্ক করতে পারেন:$val ?: 'default'E_NOTICEecho @$val ?: 'default';
ম্যাট বোরজা

29

গুগলে "পিএইচপি কোলেসেস" এর জন্য প্রথম হিট।

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

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


9
একটি ক্ষুদ্র বিড়াল র‌্যাম সংরক্ষণ করুন এবং আরোগুলিগুলিকে কোনও অ্যারেতে সদৃশ করবেন না, কেবল ভবিষ্যদ্বাণী করুন (func_get_args () $ আরগ হিসাবে) {}
ট্র্যাভিসো

17
@ [আলফ্রেড, সিয়ানান] - আপনি ভুল। foreach () কেবল একবার অ্যারে পেতে প্রথম যুক্তিকে মূল্যায়ন করে এবং তারপরে পুনরাবৃত্তি করে।
gahooa

6
ফর্চ_জেট_আরগস () পূর্বে রেখে (এখানে $ আরগ হিসাবে) পারফরম্যান্সের দৃষ্টিকোণ থেকে কোনও পরিবর্তন হবে না।
সেভেজম্যান

7
@ সাভেজম্যান ... ঠিক আপনি ... যদি আপনি নিজের প্রয়োগ থেকে এই মিলিসেকেন্ড পারফরম্যান্স বা মেমোরির কয়েকটি বাইট নিচে নেওয়ার কথা ভাবছেন তবে আপনি সম্ভবত ভুল পারফরম্যান্স / স্মৃতি
বাধাটির

4
হাস্যকরভাবে, গুগলে এটি এখন "পিএইচপি কোলেসেস" এর প্রথম হিট।
শেভার উইল হবে

18

আমি সত্যিই পছন্দ?: অপারেটর। দুর্ভাগ্যক্রমে, এটি এখনও আমার উত্পাদন পরিবেশে প্রয়োগ করা হয়নি। সুতরাং আমি এর সমতুল্য ব্যবহার:

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

1
এটি একটি 'সত্যবাদী' সম্মিলন, পাস হওয়া এন আর্গুমেন্টে মিথ্যা (নাল সহ) মূল্যায়নের যে কোনও কিছু থেকে মুক্তি পাওয়ার জন্য অ্যারে_ ফিল্টার ব্যবহার করে My অংশ আমি জানি না। দেখুন: php.net/manual/en/…
অ্যাডাম

3
আমি এটি পছন্দ করি তবে @hakre এর সাথে একমত হতে হবে - এটির coalesceপ্রথম নন-নাল যুক্তিটি প্রত্যাখ্যান করা উচিত , যার মধ্যে এটি অন্তর্ভুক্ত থাকবে FALSE। এই ফাংশনটি FALSEযদিও অপসারণ করবে সম্ভবত অপের মনে যা আছে তা নয় (কমপক্ষে আমি কোনও coalesceফাংশন থেকে যা চাই তা চাই না )।
ম্যাডব্রাইক

1
শুধুমাত্র ভেরিয়েবলগুলি রেফারেন্স দিয়ে পাস করা উচিত
বেন সিনক্লেয়ার

9

এটি লক্ষণীয় যে পিএইচপি'র অবিচ্ছিন্ন ভেরিয়েবল এবং অ্যারে সূচকগুলির চিকিত্সার কারণে, কোনও ধরণের কোলেসেস ফাংশন সীমিত ব্যবহারের। আমি এটি করতে সক্ষম হতে চাই:

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

তবে এটি, বেশিরভাগ ক্ষেত্রেই, পিএইচপি একটি E_NOTICE এর সাথে ত্রুটি ঘটায়। কোনও ভেরিয়েবল ব্যবহারের আগে এটির অস্তিত্ব পরীক্ষা করার একমাত্র নিরাপদ উপায় হ'ল সরাসরি খালি () বা আইসেট () এ ব্যবহার করা। কেভিন দ্বারা প্রস্তাবিত ত্রৈমাসিক অপারেটর হ'ল সর্বোত্তম বিকল্প যদি আপনি জানেন যে আপনার কোলেসিসের সমস্ত বিকল্প সূচনা করার জন্য পরিচিত।


এই ক্ষেত্রে, অ্যারে ইউনিয়নগুলি বেশ সুন্দরভাবে কাজ করে ( $getstuff = $_GET+$_SESSION+array('id'=>null);$id=$getstuff['id'];)।
ব্রিলিয়ান্ড

@ কুইল এর মানে কি? আপনি কি রেফারেন্স সহ প্রস্তাবিত সমাধানটি দিয়েছেন?
বেন সিনক্লেয়ার

এই খুব সাধারণ ক্রিয়াকলাপটিকে আরও সংক্ষিপ্ত করে তুলতে পিএইচপি 7 সুদৃশ্য নতুন নতুন আইসেট টার্নারি অপারেটরের ??সাথে পরিচয় করিয়ে দিয়েছে ।
বোটাইমার

6

নিশ্চিত হয়ে নিন যে আপনি নির্দিষ্ট ধরণের সাথে কীভাবে এই ফাংশনটি কাজ করতে চান তা আপনি সঠিকভাবে সনাক্ত করেছেন। পিএইচপি-তে বিভিন্ন ধরণের টাইপ-চেকিং বা অনুরূপ ফাংশন রয়েছে, সুতরাং তারা কীভাবে কাজ করে তা আপনি জানেন তা নিশ্চিত করুন। এটি 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

আমি ইথান কেন্ট পোস্ট করা উত্তরটি প্রসারিত করছি । এই উত্তরটি অ-নাল আর্গুমেন্টগুলি বাতিল করবে যা অ্যারে_ফিল্টারের অভ্যন্তরীণ কাজের কারণে মিথ্যা হিসাবে মূল্যায়ন করে যা কোনও coalesceফাংশন সাধারণত যা করে তা নয় । উদাহরণ স্বরূপ:

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

ওহো

এটি কাটিয়ে উঠতে, একটি দ্বিতীয় যুক্তি এবং ফাংশন সংজ্ঞা প্রয়োজন। Callable ফাংশন বলার জন্য দায়ী 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'));
}

আপনি যদি সহজেই পাস করতে পারেন issetবা 'isset'২ য় তর্ক হিসাবে তর্ক করতে পারেন তবে এটির array_filterভাগ্য ভাল।


0

আমি বর্তমানে এটি ব্যবহার করছি, তবে আমি ভাবছি যে পিএইচপি 5 এর নতুন কয়েকটি বৈশিষ্ট্য দিয়ে এটি উন্নত করা যায় না।

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

0

ক্লোজার সহ পিএইচপি 5.3+:

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

ডেমো: https://eval.in/187365


কেবলমাত্র পরিবর্তনশীলগুলি রেফারেন্স দ্বারা পাস করা উচিত
বেন সিনক্লেয়ার

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