我有一个数据库查询,它返回多个记录,但是我想通过键入数组作为对象将更多数据附加到此对象,以便我可以向输出添加比数据库包含的更多数据。
我已经对此进行了一些研究并发现了一些函数,例如array_merge,但每当我尝试使用它时,它给了我与数组深度相关的问题,有时甚至创建了一个全新的数组键而不是添加到当前存在的数组键上
这是我数据库中的数据:
Array
(
[Cat] => Array
(
)
[Dog] => Array
(
)
[Rabbit] => Array
(
[0] => stdClass Object
(
[name] => fluffy
[owner] => foobar
)
[1] => stdClass Object
(
[name] => toby
[owner] => foobar
)
[2] => stdClass Object
(
[name] => josie
[owner] => Joseph
)
)
)
我想这样做,以便存在的每个数组键都有一个额外的字段,但如果没有任何记录,其他动物仍然是空的。
示例:
Array
(
[Cat] => Array
(
[0] => stdClass Object
(
[name] => ralph
[owner] => Joseph
[extra] => some extra data
)
)
[Dog] => Array
(
)
[Rabbit] => Array
(
[0] => stdClass Object
(
[name] => fluffy
[owner] => foobar
[extra] => some extra data
)
[1] => stdClass Object
(
[name] => toby
[owner] => foobar
[extra] => some extra data
)
[2] => stdClass Object
(
[name] => josie
[owner] => Joseph
[extra] => some extra data
)
)
)
我试图合并两者的原因是因为我有几个辅助函数可以生成漂亮的结果而我想利用它们而不是从数据库输出原始数据,额外的数据是如何我的演示d想合并到当前数组。
谢谢!
编辑 - 更新代码:
function listPets(){
$foo = [];
foreach($pets as $p){
$getPets = $database->Findall("SELECT name, owner, info FROM pets...");
$foo[$p->name] = $getPets;
foreach($foo as $arr){
if(count($arr)){
foreach($arr as $v){
$v->extra = $this->message($getPets->info);
}
}
}
}
return $foo;
}
答案 0 :(得分:0)
解决方案是:
foreach
循环遍历数组。extra
属性附加到每个对象。所以你的代码应该是这样的:
// Suppose $array is your original array
foreach($array as $arr){
if(count($arr)){ // check if the array is empty or not
foreach($arr as $v){
$v->extra = 'some extra value'; // append extra property to the object
}
}
}
// display $array
echo '<pre>';
print_r($array);
echo '</pre>';
以下是演示:
答案 1 :(得分:0)
下面的函数合并数组&amp;对象:
<?
function fuse_data()
{
$list = func_get_args();
$data = array_shift($list);
$type = gettype($data);
$data = ((array)$data);
foreach ($list as $indx => $item)
{
foreach ($item as $name => $valu)
{
if (!isset($data[$name]) || empty($data[$name]))
{
$data[$name] = $valu;
}
}
}
return (($type == 'object') ? ((object)$data) : $data);
}
?>
像这样使用:
$data = fuse_data($result, $node2, $list3, $foo, $bar);
根据您的喜好编辑,它只是一个概念验证。
答案 2 :(得分:0)
您实际上是在尝试合并两个数组,还是只是将一些额外信息附加到动物数组中的非空键上?
在第二种情况下,根据您要添加的信息,您可以选择以下两种方式:
将其添加到SELECT语句中:
SELECT name, owner, 'extra stuff' as extra FROM ...
就像@ rajdeep-paul说的那样。只有你可以跳过空数组检查,如果它是空的,foreach不会反复遍历它:
foreach ($dbData as $animals) {
foreach ($animals as $animal) {
$animal->extra = 'extra stuff';
}
}
答案 3 :(得分:0)
你可以做点像......
foreach($pets as &$pet) { // passing by reference to manipulate the original array.
if(!empty($pet) && is_array($pet)){ // Checking if the element is an array and not empty
foreach($pet as &$feature){ // Again passing by reference the 2nd dimension
if(is_object($feature)){ // Checking if the element is object to prevent the "Property of non-object" error.
$feature->extra = 'Some value'; // If all is well, we asign the new property to the object.
}
}
}
}
现在即使我认为有更好的方法来编写(优化)查询而不是在循环中触发它!但只是为了你的问题,你的代码应该像..
function listPets(){
$foo = [];
foreach($pets as $p){
$getPets = $database->Findall("SELECT name, owner, info FROM pets...");
$foo[$p->name] = $getPets;
foreach($foo as $arr){
if(is_array($arr) && count($arr)){
foreach($arr as $v){
if(!empty($v) && is_object($v)){
$v->extra = $this->message($getPets->info);
}
}
}
}
}
return $foo;
}