我有一个查询,它根据项目数返回一个对象或一个数组。如果返回零个或一个项目,则它将该项目作为对象返回。如果有两个或更多项,则返回一个对象数组。
我想对查询结果执行foreach
,但如果它是返回的对象而不是数组,则会抛出错误。所以我创建了一个将对象转换为数组的函数。
function to_array($unknown) {
if (count($unknown) === 0) {
$array=array($unknown);
} elseif (!is_array($unknown)) {
$array = array();
$array[0] = $unknown;
} else {
$array = $unknown;
}
return $array;
}
只需拨打$query_array = to_array($query_return)
即可使用。
这是最好的方法吗?有没有更好的办法?这可能造成任何问题吗?
答案 0 :(得分:2)
您的方式看起来不错,但我建议您检查$unknown
是否可以缓存并相应地进行转换。当然,如果你不止一次这样做,那就把它放在一个函数中。
<?php
$unknown = ...; // call to API
if (!is_array($unknown) && !($unknown instanceof \Traversable)) {
$unknown = array($unknown);
}
foreach ($unknown as $item) {
// ... do things
}
答案 1 :(得分:1)
我想要对查询结果做一个foreach,但那就是抛出 如果它是返回的对象而不是数组,则会出错。
您的数据来源似乎有些不清楚或不清洁。我们谈论的是查询,对象和数组。谁知道还有什么可能,您的数据源发展得越多。因此,我会首先检查数据类型并处理所有的可能性。
gettype功能为您提供了一个很好的起点。然后你可以使用开关来处理所有可能性,甚至是未来的PHP修改,如下所示。
对于数组转换的对象,我会使用get_object_vars函数而不是简单的类型转换,因为我不清楚该类型转换器究竟会做什么。但get_object_vars函数已有详细记录。
$type = gettype ( $unknown );
switch ($type) {
case "array":
$array = $unknown;
break;
case "object":
$array = get_object_vars ( $unknown );
break;
case "boolean":
case "integer":
case "double":
case "string":
case "resource":
case "NULL":
case "unknown type":
default: throw new Exception("Unknown data type");
}
/* Do something here with $array */