所以这是我的代码:
foreach ($result->devices as $device) {
$flag = false;
foreach ($device as $key => $value) {
if(!$flag){
var_dump($key);
$flag = true;
}
var_dump($value);
}
}
我尝试实现的只是仅打印一次键(描述,品牌等),但是为每个找到的设备打印所有这些键的值。这是为了最终保存为.csv
注意:$ result =一个多维数组,我只对它的设备部分感兴趣,因此$result->devices
。
现在它的工作方式是它只为每个找到的设备打印第一个键,我现在得到的东西如下:
string 'deviceId' (length=8) // keeps getting repeated
int 4268
string 'beschrijving nr 53' (length=18)
...
string 'deviceId' (length=8) // keeps getting repeated
int 4267
string 'Weer een tooltje' (length=16)
我试图获得的是类似的东西:
string 'deviceId' (length=8)
string 'description' (length=??)
string 'status' (length=??)
... // rest of keys, followed by devices
int 4268
string 'beschrijving nr 53' (length=18)
... // rest of values, followed by other devices
int 4267
string 'Weer een tooltje' (length=16)
我确定它的操作简单,例如错误的操作顺序或某些循环中的某些内容,但在尝试了各种变化之后,我没有更聪明。
所以谁能解开这个谜团,我非常感谢你。
答案 0 :(得分:1)
所以,我想,你的数据看起来有点像这样吗?
$result = (object)[];
$result->devices = [
['deviceId' => 1, 'description' => 'desc1', 'status' => 'status14'],
['deviceId' => 2, 'description' => 'desc2', 'status' => 'status15'],
['deviceId' => 3, 'description' => 'desc3', 'status' => 'status16'],
['deviceId' => 4, 'description' => 'desc2', 'status' => 'status17'],
];
然后从中创建一个CSV文件,我会这样:
$fp = fopen('csv.csv', 'w+');
foreach($result->devices as $i => $device)
{
// First row? Write headers (keys) first!
if($i == 0) fputcsv($fp, array_keys($device));
// Write data rows
fputcsv($fp, array_values($device));
}
fclose($fp);
这样,你就会得到这个:
deviceID,description,status
1,desc1,status14
2,desc2,status15
3,desc3,status16
4,desc4,status17
这是你需要的吗?
答案 1 :(得分:0)
感谢Oleg Dubas,我发现了这个问题。看起来我过于复杂的事情(我倾向于这样做),结合尝试打印出一个对象的部分,而不是将对象强制转换为数组。这就是为什么当我尝试类似这样的方法之前,它没有用。这是新的和有效的代码:
foreach ($result->devices as $key => $device) {
if ($key == 0) {
fputcsv($out, array_keys((array)$device), "\t");
}
fputcsv($out, array_values((array)$device), "\t");
}
正如您所看到的,它几乎与Oleg的代码相同,但我只需将对象转换为关联数组。
再次感谢你的帮助,奥列格。非常感谢。