你可以在 jsonStrToArray
方法中加入去除 generateUniqueKey
生成的唯一键的逻辑。为了实现这一点,我们可以假设唯一键是无序的,且每个键都是独特的。下面是改进后的两个方法:
方法:arrayToJson
这个方法会将指定键的数组值转换为 JSON 字符串,并且为每个数组元素分配一个唯一键:
function arrayToJson(array $array = [], array $keys = [], $level = 1)
{
function generateUniqueKey()
{
return uniqid();
}
if ($level == 1) {
foreach ($keys as $key) {
if (isset($array[$key]) && is_array($array[$key])) {
$formattedData = [];
foreach ($array[$key] as $item) {
$uniqueKey = generateUniqueKey();
$formattedData[$uniqueKey] = $item;
}
$array[$key] = json_encode($formattedData, JSON_UNESCAPED_UNICODE);
}
}
}
return $array;
}
方法:jsonStrToArray
这个方法会将指定键的 JSON 字符串值转换回数组,并去除生成的唯一键:
function jsonStrToArray(array $array = [], array $keys = [], $level = 1)
{
if ($level == 2) {
foreach ($array as &$value) {
foreach ($keys as $key) {
if (isset($value[$key]) && is_string($value[$key])) {
$decodedArray = json_decode($value[$key], true);
if (is_array($decodedArray)) {
$value[$key] = array_values($decodedArray);
}
}
}
}
unset($value);
} elseif ($level == 1) {
foreach ($keys as $key) {
if (isset($array[$key]) && is_string($array[$key])) {
$decodedArray = json_decode($array[$key], true);
if (is_array($decodedArray)) {
$array[$key] = array_values($decodedArray);
}
}
}
}
return $array;
}
示例用法
假设你有一个包含数据的数组,并且你希望处理其中某些键:
$data = [
"id" => 37,
"category_id" => 2,
"partner_id" => 2,
"name" => "香港沙田服务器5型",
"cpu" => [
["name" => "2xAMD EPYC 7302", "thread" => "32核心64线程", "price" => 0],
["name" => "2xAMD EPYC 7502", "thread" => "64核心128线程", "price" => 200]
],
"ram" => [
["name" => "256G", "price" => 0],
["name" => "512G", "price" => 2450],
["name" => "1024G", "price" => 7200]
]
];
// 将数组转换为 JSON 字符串
$data = arrayToJson($data, ['cpu', 'ram'], 1);
print_r($data);
// 将 JSON 字符串转换回数组,并去除唯一键
$data = jsonStrToArray($data, ['cpu', 'ram'], 1);
print_r($data);
通过以上代码示例,你可以将指定键的数组值转换为 JSON 字符串,再将它们还原为数组并去除生成的唯一键。确保你根据具体需求调整方法的逻辑,例如处理更多嵌套层级或者不同的数据结构。