首页 > 解决方案 > 如何使 PHP 中未定义的值为 false?

问题描述

我正在使用带有远程 api 的 laravel。您可以选择附加多封电子邮件。这些电子邮件具有单选按钮和复选框选项。But they don't always have to be elected. 这就是我收到此错误的原因。以下是带有代码的示例。如果你能帮助我,我会很高兴。

如果在第二封电子邮件中未选择任何内容,我会收到此错误。

Undefined offset: 1

html

    <div class="form-group">
        <label for="name">E-posta</label>
        <div class="input-group">
            <input type="email" class="form-control email-address" name="email[]" placeholder="E-Posta giriniz">
            <div class="btn-group">
                <label class="btn btn-default">
                    <input class="primary-radio" type="radio" name="primaryEmail" value="0" checked autocomplete="off"> <span class="fas fa-star"></span>
                </label>
                <label class="btn btn-default">
                    <input class="ban-checkbox" type="checkbox" name="optOut[]" value="0" autocomplete="off"> <span class="fas fa-ban"></span>
                </label>
                <label class="btn btn-default">
                    <input class="invalid-checkbox" type="checkbox" name="invalid[]" value="0" autocomplete="off"> <span class="fas fa-exclamation-circle"></span>
                </label>
            </div>
        </div>
    </div>

php

    // Emails
    $emails = $request->input('email');
    $primaryEmail = $request->input('primaryEmail');
    $optOut = $request->input('optOut');
    $invalid = $request->input('invalid');

    $emailAddresses = array();

    $e = 0;
    foreach ($emails as $emailKey => $emailValue) {
        $emailAddresses[$emailKey] = [
            'emailAddress' => $emailValue,
            'invalid' => (intval($invalid[$e]) == $emailKey) ? true : false,
            'lower' => $emailValue,
            'optOut' => (intval($optOut[$e]) == $emailKey) ? true : false,
            'primary' => (intval($primaryEmail) == $emailKey) ? true : false,
        ];
        $e++;
    }

    dd($emailAddresses);

数组输出

    array:2 [▼
      0 => array:5 [▼
        "emailAddress" => "test@live.com"
        "invalid" => true
        "lower" => "test@live.com"
        "optOut" => true
        "primary" => true
      ]
      1 => array:5 [▼
        "emailAddress" => "hi@test.com"
        "invalid" => true
        "lower" => "hi@test.com"
        "optOut" => true
        "primary" => false
      ]
    ]

标签: phplaravel

解决方案


在您基于 HTML 的情况下,例如,当您有 3 封电子邮件时:

电子邮件 1 < 已选中所有框

电子邮件 2 < 仅选中了 optOut 复选框

电子邮件 3 < 仅选中了 2 个复选框

您的结果将如下所示:

[
    'email' => [
        0 => 'Email1',
        1 => 'Email2', 
        2 => 'Email3'
    ],
    'primaryEmail' => 0,
    'optOut' => [
        0 => 0,
        1 => 0,
        2 => 0
    ],
    'invalid' => [
        0 => 0,
        1 => 0
    ]

]

您目前面临的最大问题是您的密钥永远无法与不同的组合匹配。

解决此问题的一种方法是已经在 HTML 中使用了一个键:

   <div class="form-group">
        <label for="name">E-posta</label>
        <div class="input-group">
            <input type="email" class="form-control email-address" name="email[<SOME KEY HERE>]" placeholder="E-Posta giriniz">
            <div class="btn-group">
                <label class="btn btn-default">
                    <input class="primary-radio" type="radio" name="primaryEmail" value="0" checked autocomplete="off"> <span class="fas fa-star"></span>
                </label>
                <label class="btn btn-default">
                    <input class="ban-checkbox" type="checkbox" name="optOut[<SOME KEY HERE>]" value="0" autocomplete="off"> <span class="fas fa-ban"></span>
                </label>
                <label class="btn btn-default">
                    <input class="invalid-checkbox" type="checkbox" name="invalid[<SOME KEY HERE>]" value="0" autocomplete="off"> <span class="fas fa-exclamation-circle"></span>
                </label>
            </div>
        </div>
    </div>

所有字段的 SOME KEY HERE 必须相同(如果您想跟踪主字段所属的电子邮件,即使是 primaryEmail 字段)。


推荐阅读