PHP:如何只从数组中打印一次键和每个项的每个值?

时间:2016-09-23 14:05:57

标签: php arrays multidimensional-array

所以这是我的代码:

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)

我确定它的操作简单,例如错误的操作顺序或某些循环中的某些内容,但在尝试了各种变化之后,我没有更聪明。

所以谁能解开这个谜团,我非常感谢你。

2 个答案:

答案 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的代码相同,但我只需将对象转换为关联数组。

再次感谢你的帮助,奥列格。非常感谢。