Цикл вложенных массивов в php 7.2 - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь получить доступ к значениям во вложенном массиве, который я отправляю в мой API, но когда я делаю что-то вроде $ data ['input'] {0}, он возвращает мне только первую букву ключа, когда я хочуполное значение значения, а не ключ, но если я попробую что-то вроде $ data ['input'] ['type'], это даст мне ошибку смещения, я уверен, как правильно получить доступ к значениям так, как мне нужно

public function saveEdit(Request $request)
{
    try {
        $unsanitizedData = $request->all();
        $data = [];
        $fid = $unsanitizedData['formId'];
        $data['form_name'] = json_encode($unsanitizedData['cred']['name']);
        $data['org'] = json_encode($unsanitizedData['cred']['organization']);
        $data['updated_by'] = json_encode($unsanitizedData['updatedBy']);
        $data['user_id'] = json_encode($unsanitizedData['id']);
        $data['activated'] = json_encode($unsanitizedData['cred']['activated']);
        $data['inputs'] = json_encode($unsanitizedData['cred']['inputs']);
        $pattren = array("[","]","'",'"',"/","\\");
        $data = str_replace($pattren,'', $data);
        foreach ($unsanitizedData as $st) {
            admin_form::where('id', $fid)->update([
                'form_name' => $data['form_name'],
                'org' => $data['org'],
                'updated_by' => $data['updated_by'],
                'user_id' => $data['user_id'],
                'activated' => $data['activated']
                ]);
                foreach ($data['inputs'] as $input) {
                    admin_form_fields::where('form_id', $fid)->update([
                        'type' => $input,
                        'name' => $input
                    ]);
                }
        }


        $res['status'] = true;
        $res['message'] = 'Success';
        return response($res, 200);
    } catch (\Illuminate\Database\QueryException $ex) {
        $res['status'] = false;
        $res['message'] = $ex->getMessage();
        return response($res, 500);
    }
}

Я подумал, что если я использую цикл foreach внутри другого цикла foreach, он будет работать, потому что это вложенный массив, так что цикл через основной, а затем через вложенный, но это также не работает

Структура данных, когда я делаю дамп данных:

array:6 [
    "form_name"  => "Testname",
    "org"        => "TestOrg",
    "updated_by" => "test",
    "user_id"    => "29",
    "activated"  => "false",
    "inputs"     => "{type:number,name:Phone},{type:input,name:Name},{type:input,name:Address},{type:email,name:Email}"
]

Ответы [ 2 ]

2 голосов
/ 07 октября 2019

В вашем случае $data['inputs'] - это строка в кодировке JSON, из которой вы удалили символы [ и ], поэтому при попытке доступа к его первому элементу это первый символ (так как строки видаиз массивов строк в PHP, они действительно являются массивом строк в C).

Проблема в том, что вы вначале вызываете json_encode(). Если это то, как вы дезинфицируете ввод, вы делаете это неправильно. Поскольку вы используете ORM, нет никакой необходимости вручную дезинфицировать входные данные. Просто сохраните введенные клиентом данные и выполните все свои операции, а затем используйте их без проверки в QueryBuilder

0 голосов
/ 07 октября 2019

Насколько я вижу, вам просто нужно использовать json_decode($data['inputs']), так как ваш массив на самом деле просто строка:)

...