سؤال

هذا السؤال لديه بالفعل إجابة هنا:

$items = (isset($_POST['items'])) ? $_POST['items'] : array();

أنا لا أفهم مقتطف آخر من هذا الرمز "? $_POST['items'] : array();"

ماذا يفعل هذا المزيج من التعليمات البرمجية بالضبط؟

أستخدمها لاتخاذ مجموعة من القيم من مربعات نص HTML وتخزينها في صفيف جلسة. ولكن المشكلة هي، إذا حاولت إعادة إرسال البيانات في مربعات النص، تقوم جلسة الصفيف الجديدة بالكتابة فوق صفيف الجلسة القديمة مسافات فارغة تماما وجميعها.

أريد فقط الكتابة فوق الأماكن في الصفيف الذي يحتوي بالفعل على القيم. إذا قرر المستخدم ملء عدد قليل فقط من مربعات النص، فأنا لا أريد الكتابة فوق بيانات صفيف الدورة السابقة عن طريق المسافات الفارغة (من مربعات النص الفارغة).

أفكر في الكود أعلاه هو المشكلة، لكنني لست متأكدا من كيفية عملها. تنوير لي من فضلك.

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

المحلول

هذا هو أ مشغل ثلاثي:

التعبير (expr1) ? (expr2) : (expr3) يقيم إلى expr2 إذا expr1 يقيم إلى TRUE, ، و expr3 إذا expr1 يقيم إلى FALSE.

نصائح أخرى

هذا الجزء الأخير معروف باسم المشغل الشرطي. وبعد في الأساس هو مكثف if/else بيان.

إنه يعمل مثل هذا:

$items =
    // if this expression is true
    (isset($_POST['items'])) 
    // then "$_POST['items']" is assigned to $items
    ? $_POST['items'] 
    // else "array()" is assigned
    : array();

هنا أيضا بعض الكود الزائفي الذي قد يكون أبسط:

$items = (condition) ? value_if_condition_true : value_if_condition_false;

يحرر: فيما يلي ملاحظة سريعة ومحددة: تقوم وثائق PHP باستدعاء هذا المشغل مشغل ثلاثي. وبعد في حين أن المشغل الشرطي هو أحد المشغلين من الناحية الفنية (أي مشغل مع 3 معاملات) فهو غير رسمي (والافتراض إلى حد ما) للاتصال به ال مشغل ثلاثي.

انظر إلى إجابة باولو لفهم المشغل القصير.

للقيام بما تبحث عنه، قد ترغب في استخدام متغير جلسة.

في الجزء العلوي من صفحتك وضع هذا (نظرا لأنك لا تستطيع إخراج أي شيء على الصفحة قبل بدء جلسة. أي عدم وجود بيانات الصدى)

session_start();

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

رمز HTML (TestForm.html):

<html>
    <body>
    <form name="someForm" action="process.php" method="POST"> 
        <input name="items[]" type="text">
        <input name="items[]" type="text">
        <input name="items[]" type="text">
        <input type="submit">
    </form>
    </body>
</html>

رمز المعالجة (process.php):

<?php
session_start();

if(!$_SESSION['items']) {
    // If this is the first time the user submitted the form,
    // set what they put in to the master list which is $_SESSION['items'].
    $_SESSION['items'] = $_POST['items'];
}
else {
    // If the user has submitted items before...
    // Then we want to replace any fields they changed with the changed value
    // and leave the blank ones with what they previously gave us.
    foreach ($_POST['items'] as $key => $value) {
        if ($value != '') { // So long as the field is not blank
            $_SESSION['items'][$key] = $value;
        }
    }
}


// Displaying the array.
foreach ($_SESSION['items'] as $k => $v) {
    echo $v,'<br>';
}
?>

هذا هو نفسه:

if (isset($_POST['items']){
    $items = $_POST['items'];
} else {
    $items = array();
}

في الأساس إذا كانت $ _Post ['العناصر' موجودة ثم يتم تعيين عناصر $ إليها على خلاف ذلك، يتم تعيينها إلى صفيف فارغ.

إنه مشغل ثغرى يقول أساسا إذا كان مفتاح العناصر في $ _Post، ثم قم بتعيين عناصر $ إلى متساوية قيمة $ _Post ["العناصر"] آخر تعيينها إلى صفيف فارغة.

احسب أنه يستحق أيضا أن يلاحظ ذلك ?: هو عامل منفصل، حيث:

$one = $two ?: $three;
$one = two() ?: three();

اختصار من أجل:

$one = $two ? $two : $three;
$one = two() ? two() : three();

بصرف النظر عن الكتابة أقل، فإن ميزة وقت التشغيل هي أنه، إذا كنت تستخدم وظيفة مثل two(), ، لن يتم تقييم الوظيفة إلا بمجرد استخدام شكل الاختصار، ولكن ربما نسفر باستخدام النموذج الطويل.

نعم ... إنه مشغل ثلاثي

شرح بسيط وواضح المقدمة هنا, ، الذي قال المؤلف إنه مثل الإجابة: "حسنا، هل صحيح؟"

القولون يفترق قيمتين محتملة (أو). سيتم اختيار القيمة الأولى إذا كان تعبير الاختبار صحيحا. سيتم اختيار الثانية (وراء القولون) إذا كانت الإجابات الأولى خاطئة.

مشغل Ternary مفيد للغاية في إنشاء متغير في PHP 7.x، مجانا تحذير إشعار. علي سبيل المثال"

$mod = isset($_REQUEST['mod']) ? $_REQUEST['mod'] : "";
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top