2016-09-23 24 views
0

因此,这里是我的代码:PHP:如何从数组中只打印一次每个项目的值?

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) 

我确定这是简单的,就像操作顺序错误,或者将某些东西移入/移出某个循环,但在尝试过各种变化之后,我并不聪明。

那么谁能解开这个谜,我非常感谢你。

+1

add this'var_dump($ value);'in else – devpro

+0

这并不完全清楚你想要达到什么,以及你自己做了什么。你能否给我们展示一些代码,以及一个带有示例输出csv的正确示例输入数组。然后,我们可能能够正确地提供帮助 –

+0

我会简化它并分开编写标题和数据行。在循环输出第一个数组元素的键之前。然后遍历所有元素并输出值。 – Kwebble

回答

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 

这是你需要什么?

+0

有趣的是使用普通数组作为键=>值对。 – Kwebble

+0

@Oleg Dubas 我以前试过,但问题是,我的对象如下所示: $ result-> devices = [[= object(stdClass)) 'deviceId'=> 1 , 'description'=>'desc1', ... ], 1 => [ 'deviceId'=> 2, ... ] ] –

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的帮助。非常感谢。