【问题标题】:Unify variable types of array elements统一数组元素的可变类型
【发布时间】:2010-10-19 23:22:18
【问题描述】:

经过数小时的调试,我发现我的一个脚本中有一个错误。为了在数据库中保存不同的事件类型,我为每个事件提供了一组唯一数据,可用于识别事件。

所以我基本上有一些类似的代码

$key = md5(json_encode($data));

为每个事件生成一个唯一的密钥。

现在,在某些情况下,$data 数组中的值是一个整数,有时是一个字符串(取决于它的来源——数据库或 URL)。这会导致 json_encode() 的输出彼此不同 - 一次包含引号,一次不包含。

有人知道“统一”$data 数组中的变量类型的方法吗?这可能意味着将所有仅包含整数值的字符串转换为整数。使用json_encode()时还有什么需要注意的吗?

【问题讨论】:

  • 附带说明,我们数据库中的大多数事件(显然除了错误创建的事件之外)现在都基于字符串,因此最好将整数转换为字符串,而不是使用其他方式周围。
  • 我在考虑建议,如果您只需要一致的哈希,但我不确定您将它用于什么......
  • 是的,我需要一个一致的哈希,这就是它的意义所在。

标签: php variable-types


【解决方案1】:

array_walk_recursive 与您编写的函数相结合,以实现maybe_intval 的效果,该函数执行您所说的对单个元素的转换。

编辑:更仔细地阅读array_walk_recursive 的文档后,您实际上会想要编写自己的递归函数

function to_json($obj){
  if(is_object($obj))
    $obj=(array)$obj;
  if(is_array($obj))
    return array_map('to_json',$obj);
  return "$obj"; // or return is_int($obj)?intval($obj):$obj; 
}

【讨论】:

  • 为什么不array_walk_recursive呢?
  • 好的,我使用了array_map(不需要递归)和一个简单的整数到字符串的转换函数。感谢您的所有帮助。
  • array_walk_recursive 据我所知不会让你修改原始对象或跟踪任何嵌套结构 - 你可以只是例如打印它。如果你没有嵌套结构 array_map 会做
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
  • 2021-12-02
  • 2013-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多