Запрос смешан с JSON строками и полями массива, потеря данных в пользовательской функции для сокращения - PullRequest
0 голосов
/ 05 августа 2020

От POST Запрос я получаю и смешиваю структуру JSON и поля Array; обрабатывать несколько типов элементов; Я выполняю и var_dump, чтобы получить проходы $_POST и получить это:

array(2) {
  ["json_data"]=>
  string(677) "[{"firstname":""},{"lastname":""},{"email":""},{"countryCode":""},{"phone":""},{"i_signup_password":""},{"i_signup_password_rep":""},{"email":""},{"i_signin_password":""},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"}]",
  ["other_data"]=>
  string(11) "Other_Data"
}

На стороне сервера PHP я выполняю функцию, которая сокращает это $_POST до этого массива:

array(10) {
  ["firstname"]=>
  string(0) ""
  ["lastname"]=>
  string(0) ""
  ["email"]=>
  string(0) ""
  ["countryCode"]=>
  string(0) ""
  ["phone"]=>
  string(0) ""
  ["i_signup_password"]=>
  string(0) ""
  ["i_signup_password_rep"]=>
  string(0) ""
  ["i_signin_password"]=>
  string(0) ""
  ["form"]=>
  string(11) "d-sys-login"
  ["process"]=>
  string(8) "e-signin"
}

Сценарий, используемый для выполнения этого вывода, следующий:

<?php
function buildVirtualData($data)
{
    if (is_array($data)) {
        foreach ($data as $val) {
            $chk = buildVirtualData($val);
            if ($chk) {
                $json_obj = json_decode($val, true);
                foreach ($json_obj as $key1 => $json_sub_obj) {
                    foreach ($json_sub_obj as $key2 => $value2) {
                        if ('true' === $value2) {
                            $json_obj[$key1][$key2] = true;
                        } elseif ('false' === $value2) {
                            $json_obj[$key1][$key2] = false;
                        } elseif (is_array($value2)) {
                            $temp = [];
                            foreach ($value2 as $keyof => $valueof) {
                                $temp[$keyof] = buildVirtualData($valueof);
                            }
                            $json_obj[$key1][$key2] = $temp;
                        }
                    }
                }
                return $json_obj;
            } elseif (false == $chk && is_array($val)) {
                $temp = [];
                foreach ($val as $key => $value) {
                    $temp[$key] = buildVirtualData($value);
                }
                $val = $temp;
                return $val;
            } else {
                if ('true' === $val) {
                    $val = true;
                } elseif ('false' === $val) {
                    $val = false;
                }
                return $val;
            }
        }
    } else {
        return $chk = valJson($data);
    }
}

function valJson($var)
{
    if (!is_array($var)) {
        return ((json_decode($var) != null) &&
            (is_object(json_decode($var)) || is_array(json_decode($var)))) ? true : false;
    } else {
        return false;
    }
}
function reduArray($array)
{
    $result = $array;
    if (is_array($array)) {
        $check = true;
        foreach ($array as $key => $value) {
            if (!is_array($value)) {
                $check = false;
                break;
            }
        }
        if ($check) {
            $result = array_reduce($array, 'array_merge', []);
        }
    }
    return $result;
}

$_POST=[];
$_POST['JsonData']='[{"firstname":""},{"lastname":""},{"email":""},{"countryCode":""},{"phone":""},{"i_signup_password":""},{"i_signup_password_rep":""},{"email":""},{"i_signin_password":""},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"}]';
$_POST['otherdata']='otherdata';
$_POST=buildVirtualData($_POST);
$_POST=reduArray($_POST);
echo var_dump($_POST);

Основная проблема заключается в том, что отсутствует последний массив элементов:

  ["other_data"]=>
  string(11) "other_data"
  1. как я могу предотвратить потерю данных?
  2. этот скрипт можно попроще?

1 Ответ

0 голосов
/ 05 августа 2020

сценарий решения, но нужно его упростить:

<?php
    function buildVirtualData($data)
    {
    
        if (is_array($data)) {
            $temp = [];
            foreach ($data as $key => $value) {
                $temp[$key] = buildVirtualData($value);
            }
            return reduArray($temp);
        } elseif (valJson($data)) {
            $json_obj = json_decode($data, true);
            foreach ($json_obj as $key1 => $json_sub_obj) {
                foreach ($json_sub_obj as $key2 => $value2) {
                    if (is_array($value2)) {
                        $temp = [];
                        foreach ($value2 as $keyof => $valueof) {
                            $temp[$keyof] = buildVirtualData($valueof);
                        }
                        $json_obj[$key1][$key2] = $temp;
                    } else {
                        if ('true' === $value2 || true === $value2) {
                            $json_obj[$key1][$key2] = true;
                        } elseif ('false' === $value2 || false === $value2) {
                            $json_obj[$key1][$key2] = false;
                        } else {
                            $json_obj[$key1][$key2] = $value2;
                        }
                    }
                }
                return reduArray($json_obj);
            }
        } else {
            if ('true' === $data || true === $data) {
                $data = true;
            } elseif ('false' === $data || false === $data) {
                $data = false;
            }
            return $data;
        }
    }
    
    function valJson($var)
    {
        if (!is_array($var)) {
            return ((json_decode($var) != null) &&
                (is_object(json_decode($var)) || is_array(json_decode($var)))) ? true : false;
        } else {
            return false;
        }
    }
    function reduArray($array)
    {
        $result = $array;
        if (is_array($array)) {
            $check = true;
            foreach ($array as $key => $value) {
                if (!is_array($value)) {
                    $check = false;
                    break;
                }
            }
            if ($check) {
                $result = array_reduce($array, 'array_merge', []);
            }
        }
        return $result;
    }
    
    $_POST=[];
    $_POST['JsonData']='[{"firstname":""},{"lastname":""},{"email":""},{"countryCode":""},{"phone":""},{"i_signup_password":""},{"i_signup_password_rep":""},{"email":""},{"i_signin_password":""},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"},{"form":"d-sys-login"},{"process":"e-signin"}]';
    $_POST['otherdata']='otherdata';
    $_POST=buildVirtualData($_POST);
    $_POST=reduArray($_POST);
    echo var_dump($_POST);
...