问题描述
foreach ($results as $v)
{
$k = str_replace('profile.','',$v[0]);
$data->profile[$k] = json_decode($v[1],true);
if ($data->profile[$k] === null)
{
$data->profile[$k] = $v[1];
}
}
我遇到了这些代码行,它们位于Joomla的“个人资料”插件中,profile.PHP
文件中。 $result
是从此表加载的用户配置文件字段的键/值对数组
您可以看到这些值主要是普通的字符串或数字。
由于用户不太可能在此处输入JSON字符串,那么为什么在此处使用json_decode
?
我在这里有什么特殊目的吗?
解决方法
在预期为标量(不可迭代)的数据上使用json_decode()
似乎大部分都是多余的,因为在大多数情况下,字符串,整数和浮点数不会受到影响。
有一些边缘情况,例如:
- Strings containing escaped forward slashes
- Strings containing multibyte characters
- Strings containing boolean-expressions as strings that will be used as boolean type
- Strings containing numeric-interpreted values that will be used as integer/float type
- ...可能还有更多我不考虑的情况
这里是非详尽的Demo:
$tests = [
'true',null,'123',123,json_encode('1/2'),json_encode('База данни грешка')
];
foreach ($tests as $test) {
echo var_export(json_decode($test,true)) . "\n---\n";
}
输出:
true #now boolean type
---
NULL
---
123 #now integer type
---
123
---
'1/2' #previously had escaped slash in storage
---
'База данни грешка' #previously mutated as unicode expressions in storage
---
因此,在某些情况下,encoding-storing-decoding会在可能遭受“打ic”的环境中创建稳定性。在其他情况下,当环境不允许存储布尔类型值时,将字符串值呈现为布尔值可能是一种变通方法。
所有这些,在处理复杂/意外的数据结构/值时,允许在可自定义字段中使用json类型数据为Joomla及其用户提供了更大的实用性。
p.s。条件:
if ($data->profile[$k] === null)
{
$data->profile[$k] = $v[1];
}
只是Joomla尝试在预期结果失败时进行一些清理,因为该值在进入存储之前没有经过json_encoded的适当处理(...容纳不良的开发/数据或Joomla的先前版本而不是json_encoding )。
,此处使用JSON来允许存储不同的数据类型(包括数组和对象),并将它们还原为代码中的正确类型,同时保持用于处理数据的代码最少。即没有针对特定字段的特殊处理,所有操作都在一个简单的循环中完成。