【问题标题】:Request mixed with JSON strings and array fields, Losing data in custom function for reduction请求与 JSON 字符串和数组字段混合,在自定义函数中丢失数据以减少
【发布时间】:2020-08-04 22:23:24
【问题描述】:

来自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. 这个脚本可以更简单吗?

【问题讨论】:

  • 也许您应该首先简化发送参数的方式,因此您不需要这样做。
  • 嗨@Barmar,我无法修改该部分在发送数据的javascript中的工作方式。
  • 看起来您的代码要求数据中的所有字符串都是 JSON。我在遵循所有逻辑时遇到了麻烦,但是如果json_decode() 失败,您需要让它保持数组元素不变,而不是删除它。
  • @Barmar 据我所知,我什至不知道我在哪里删除它元素;这就是为什么我猜它是数据丢失但我在我的代码中找不到那个小错误的原因;假设不是所有的都是JSON,假设如果是array,也必须遍历它,直到找到不是数组的最后一个元素并使用key(文本)和value.
  • 但是当它不是数组时,它会尝试将其解码为 JSON。

标签: php arrays json performance reduce


【解决方案1】:

解决方案脚本,但需要使其更简单:

<?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);

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 2021-01-11
    • 2014-11-15
    • 1970-01-01
    • 2018-08-22
    • 2017-08-31
    • 2016-05-31
    • 1970-01-01
    • 2021-12-07
    相关资源
    最近更新 更多