سؤال

والعديد من لغات البرمجة لها وظيفة تتجمع (ترجع أول قيمة غير فارغة، <وأ href = "http://www.postgresql.org/docs/9.3/static/functions-conditional.html#FUNCTIONS-COALESCE- NVL-IFNULL "يختلط =" noreferrer "> مثال ). PHP، للأسف في عام 2009، لا.

وماذا سيكون وسيلة جيدة لتنفيذ واحد في PHP حتى PHP نفسه يحصل على وظيفة الاندماج؟

هل كانت مفيدة؟

المحلول

وهناك عامل جديد في بي 5.3 والذي يفعل ذلك: ?:

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

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

// B
echo false ?: 'B';

// B
echo null ?: 'B';

المصدر: http://www.php.net/ChangeLog-5. فب # 5.3.0

نصائح أخرى

وPHP 7 قدم حقيقية <لأ href = "http://php.net/manual/en/migration70.new-features.php#migration70.new-features.null-coalesce-op" يختلط = "noreferrer" > مشغل تتجمع :

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

وإذا كانت القيمة قبل ?? لا وجود أو null القيمة بعد أخذ ??.

وهذا التحسن على المشغل ?: المذكور هو أن ?? يعالج أيضا المتغيرات غير محددة دون طرح E_NOTICE.

وضرب الأول ل "تتجمع فب" على جوجل.

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

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

وأنا حقا مثل: المشغل. لسوء الحظ، لم تنفذ حتى الآن على بيئة الإنتاج بلدي. ولذا فإنني استخدام ما يعادل هذا:

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

وتجدر الإشارة إلى أنه نظرا للمعاملة PHP من المتغيرات uninitalised ومؤشرات المصفوفة، أي نوع من وظيفة تتجمع هو من الاستخدام المحدود. أحب أن تكون قادرة على القيام بذلك:

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

ولكن هذه الإرادة، في معظم الحالات، يسبب PHP للخطأ مع E_NOTICE. السبيل الوحيد الآمن لاختبار وجود متغير قبل استخدامه هو لاستخدامه مباشرة في فارغة () أو isset (). المشغل الثلاثي الذي اقترحه كيفن هو الخيار الأفضل إذا كنت تعرف أن تعرف كل الخيارات في تتجمع ليتم initialised.

تأكد من أنك تعرف بالضبط كيف تريد هذه الوظيفة للعمل مع أنواع معينة. 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 منهم.

وأنا التوسع في الإجابة المرسلة بواسطة إيثان كينت . وهذا الجواب تجاهل حجج غير فارغة التي تقيم إلى false بسبب الأعمال الداخلية لل 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'));
}

وسيكون جميلا لو أمكنكم ببساطة تمرير isset أو 'isset' كوسيطة 2ND إلى array_filter، ولكن لا يوجد مثل هذا الحظ.

وأنا حاليا باستخدام هذا، لكنني أتساءل عما إذا كان لا يمكن تحسينها مع بعض الميزات الجديدة في PHP 5.

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

وPHP 5.3+، مع إغلاق:

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

وعرض توضيحي: https://eval.in/187365

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top