كيف يمكنني استخدام مشغل الثلاثي ( ?:) في PHP هو اختصار ل "إذا / آخر" ؟

StackOverflow https://stackoverflow.com/questions/1506527

سؤال

استنادا إلى أمثلة من هذه الصفحة, لدي العامل وغير العامل نماذج التعليمات البرمجية أدناه.

العامل التعليمات البرمجية باستخدام if بيان:

if (!empty($address['street2'])) echo $address['street2'].'<br />';

غير العامل التعليمات البرمجية باستخدام مشغل الثلاثي:

$test = (empty($address['street2'])) ? 'Yes <br />' : 'No <br />';

// Also tested this
(empty($address['street2'])) ? 'Yes <br />' : 'No <br />';

التحديث
بعد براين نصيحة ، وجدت أن مرددا $test النواتج المتوقعة النتيجة.التالية تعمل مثل السحر!

echo (empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />';
هل كانت مفيدة؟

المحلول

ال

(condition) ? /* value to return if condition is true */ 
            : /* value to return if condition is false */ ;

بناء الجملة ليس "اختصارا إذا" المشغل ( ? يسمى المشغل الشرطي) لأنه لا يمكنك تنفيذ الرمز بنفس الطريقة كما لو كنت:

if (condition) {
    /* condition is true, do something like echo */
}
else {
    /* condition is false, do something else */
}

في مثالك، أنت تنفذ echo بيان عندما $address ليس فارغا. لا يمكنك القيام بذلك بنفس الطريقة مع المشغل الشرطي. ما يمكنك القيام به، هو echo نتيجة المشغل الشرطي:

echo empty($address['street2']) ? "Street2 is empty!" : $address['street2'];

وهذا سوف يعرض "الشارع فارغ!" إذا كان فارغا، وإلا فسيعرض عنوان Street2.

نصائح أخرى

PHP 7+.

اعتبارا من PHP 7، يمكن إجراء هذه المهمة ببساطة باستخدام غير فارغ من المشغل مثله :

echo !empty($address['street2']) ?? 'Empty';

الإعلان الأساسي الحقيقي / الخاطئ

$is_admin = ($user['permissions'] == 'admin' ? true : false);

رسالة الترحيب الشرطية

echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!';

البنود الشرطية رسالة

echo 'Your cart contains '.$num_items.' item'.($num_items != 1 ? 's' : '').'.';

مشغل Ternary هو مجرد اختصار وإذا / كتلة أخرى. لا يحتوي رمز العمل الخاص بك على شرط آخر، لذلك غير مناسب لهذا الغرض.

المثال التالي سيعمل:

echo empty($address['street2']) ? 'empty' : 'not empty';

إنه مشغل مشغل Ternary AKA ELVIS (Google IT: P) الذي تبحث عنه.

echo $address['street2'] ?: 'Empty'; 

تقوم بإرجاع قيمة المتغير أو الافتراضي إذا كان المتغير فارغا.

علما بأن عند استخدام الشرطي المتداخلة المشغلين ، قد ترغب في استخدام قوسين لتجنب المشاكل المحتملة!

يبدو PHP لا تعمل بنفس الطريقة على الأقل جافا سكريبت أو C#.

$score = 15;
$age = 5;

// The following will return "Exceptional"
echo 'Your score is: ' . ($score > 10 ? ($age > 10 ? 'Average' : 'Exceptional') : ($age > 10 ? 'Horrible' : 'Average'));

// The following will return "Horrible"
echo 'Your score is: ' . ($score > 10 ? $age > 10 ? 'Average' : 'Exceptional' : $age > 10 ? 'Horrible' : 'Average');

نفس التعليمات البرمجية في جافا سكريبت و C# عودة "استثنائية" في كل الحالات.

في 2 حالة ما PHP هل هو (أو على الأقل هذا ما فهمته):

  1. هو $score > 10?نعم
  2. هو $age > 10?لا, لذلك الحالي $age > 10 ? 'Average' : 'Exceptional' يعود 'استثنائية'
  3. ثم بدلا من مجرد وقف كل بيان و العودة 'استثنائية' ، ويستمر تقييمها التالي
  4. التالي يصبح 'Exceptional' ? 'Horrible' : 'Average' والتي ترجع 'مروعة' ، 'استثنائية' هو تروثي

من الوثائق: http://php.net/manual/en/language.operators.comparison.php

فمن المستحسن أن يمكنك تجنب "التراص" الثلاثي التعبيرات.PHP السلوك عند استخدام أكثر من مشغل الثلاثي في واحد البيان غير واضح.

رسالة الترحيب الشرطية

echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!';

متداخلة PHP اختصار

echo 'Your score is:  '.($score > 10 ? ($age > 10 ? 'Average' : 'Exceptional') : ($age > 10 ? 'Horrible' : 'Average') );

يمكنك القيام بذلك حتى أقصر من خلال استبدال echo مع <?= code ?>

<?=(empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />'?>

هذا مفيد بشكل خاص عندما تريد تحديد، داخل Navbar، ما إذا كان يجب عرض خيار القائمة كما هو موضح بالفعل (النقر) أم لا:

<li<?=($basename=='index.php' ? ' class="active"' : '')?>><a href="index.php">Home</a></li>

فيما يلي بعض الأمثلة المثيرة للاهتمام، مع شروط واحدة أو أكثر.

$value1 = '1';
$value2 = '2';
$value3 = '3';

// 1 Condition
$v1 = ($value1 == '1') ? TRUE : FALSE;
var_dump($v1);
echo "<br>";

// 2 Conditions
$v2 = ($value1 == '' ? TRUE : ($value2 == '2' ? TRUE : FALSE));
var_dump($v2);
echo "<br>";

// 3 Conditions
$v3 = ($value1 == '' ? TRUE : ($value2 == '' ? TRUE : ($value3 == '3' ? TRUE : FALSE)));
var_dump($v3);
echo "<br>";

// 4 Conditions
$v4 = ($value1 == '1') ? ($value2 == '2' ? ($value3 == '3' ? TRUE : 'FALSE V3') : 'FALSE V2') : 'FALSE V1' ;
var_dump($v4);
echo "<br>";

أعتقد أنك استخدمت الأقواس بطريقة خاطئة. جرب هذا:

$test = (empty($address['street2']) ? 'Yes <br />' : 'No <br />');

أعتقد أنه يجب أن تعمل، يمكنك أيضا استخدام:

echo (empty($address['street2']) ? 'Yes <br />' : 'No <br />');

هناك أيضا مشغل ثلاثي الاختصار ويبدو أن هذا:

(التعبير 1)؟: التعبير 2 سوف يعود التعبير 1. إذا كان يقيم إلى True أو التعبير 2 غير ذلك.

مثال:

$a = 'Apples';
echo ($a ?: 'Oranges') . ' are great!';

سيعود

Apples are great!

منذ PHP 5.3، من الممكن ترك الجزء الأوسط من المشغل الثلاثي. Expression EXPR1 ؟: إرجاع Expr3 إرجاع Expr1 إذا كان EXPR1 يقيم إلى True و EXPR3 خلاف ذلك.

من دليل PHP

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