我有一个小函数,它读取CSV文件并输出标题后面的所有行。
现在我想扩展此函数以接受location
,因此只输出包含此location
的行。我不确定如何做到这一点。
以下是CSV文件:
ID,Location,output,wdatatyp,wdb,wbyte,wbit,bitval,rdatatyp,rdb,rbyte,rbit
Lampe1Taster,Wohnzimmer,#output,DB,1,0,0,1,A,0,0,7
Lampe2Ein,Wohnzimmer,#output2,DB,1,0,1,1,A,0,0,6
Lampe2Aus,Küche,#output2,DB,1,0,1,0,A,0,0,6
location
将是第二个coloumn。在这种情况下Wohnzimmer
和Küche
。
这是功能:
$id = $_GET['location'];
$rows = file('data.csv');
foreach ($rows as $row){
echo $row;
list ($id_num) = explode(",", $row);
if ($id_num == $id){
echo $row;
break;
}
}
这将获取FIRST coloumn匹配的行。但我希望它能够获取SECOND coloumn匹配的行。
我将提供location
,如此:
plc.php?function=LoadRoom&location=Wohnzimmer
因此,如果“位置”是Wohnzimmer,我需要输出看起来完全如此。
Lampe1Taster,Wohnzimmer,#output,DB,1,0,0,1,A,0,0,7
Lampe2Ein,Wohnzimmer,#output2,DB,1,0,1,1,A,0,0,6
任何帮助都表示赞赏!
答案 0 :(得分:3)
也许您应该考虑使用内置的PHP fgetcsv()
(或str_getcsv
,)函数来解析CSV字段,而不是使代码复杂化?
Example #1(用于将CSV文件解析为数组的方便的一行内容):
$csv = array_map('str_getcsv', file('data.csv'));
$row = 1;
if (($handle = fopen("data.csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
echo "<p> $num fields in line $row: <br /></p>\n";
$row++;
for ($c=0; $c < $num; $c++) {
echo $data[$c] . "<br />\n";
}
}
fclose($handle);
}
或者使用函数分离逻辑,例如:
/**
* Convert a csv string, or an array of items which
* may contain csv strings, into an array of items.
*
* @param $args
* A simple csv string; e.g. 'a,b,c'
* or a simple list of items; e.g. array('a','b','c')
* or some combination; e.g. array('a,b','c') or array('a,','b,','c,')
*
* @returns array
* A simple list of items (e.g. array('a','b','c')
*/
function _convert_csv_to_array($args) {
//
// Step 1: implode(',',$args) converts from, say, array('a,','b,','c,') to 'a,,b,,c,'
// Step 2: explode(',', ...) converts to array('a','','b','','c','')
// Step 3: array_filter(...) removes the empty items
// Step 4: array_map(...) trims extra whitespace from each item
// (handles csv strings with extra whitespace, e.g. 'a, b, c')
//
return array_map('trim', array_filter(explode(',', is_array($args) ? implode(',',$args) : $args)));
}
来源:drush.inc
然后您可以像对待数组元素一样访问正确的元素($arr[0]
)。
基于上述内容,要解决您的特定问题,请查看以下示例代码:
$csv = 'ID,Breich,output,wdatatyp,wdb,wbyte,wbit,bitval,rdatatyp,rdb,rbyte,rbit
Lampe1Taster,Wohnzimmer,#output,DB,1,0,0,1,A,0,0,7
Lampe2Ein,Wohnzimmer,#output2,DB,1,0,1,1,A,0,0,6
Lampe2Aus,Küche,#output2,DB,1,0,1,0,A,0,0,6'; // CSV data
$input = @$_GET['id'] ?: 'Breich'; // input column name
$value = @$_GET['value'] ?: 'Wohnzimmer'; // input value to search
$csv = array_map("str_getcsv", explode(PHP_EOL, $csv));
$keys = array_shift($csv);
$key = array_search($input, $keys);
while ($line = array_shift($csv)) {
if ($line[$key] == $value) {
print implode(',', $line) . PHP_EOL;
}
}
// Outputs:
// Lampe1Taster,Wohnzimmer,#output,DB,1,0,0,1,A,0,0,7
// Lampe2Ein,Wohnzimmer,#output2,DB,1,0,1,1,A,0,0,6
答案 1 :(得分:0)
我的data.csv填充了这个:
ID,location,output,wdatatyp,wdb,wbyte,wbit,bitval,rdatatyp,rdb,rbyte,rbit
Lampe1Taster,Wohnzimmer,#output,DB,1,0,0,1,A,0,0,7
Lampe2Ein,Wohnzimmer,#output2,DB,1,0,1,1,A,0,0,6
Lampe2Aus,Küche,#output2,DB,1,0,1,0,A,0,0,6
这很好用。
$csv = file_get_contents('data.csv');
$input = 'location'; // Welche Spalte soll gelesen werden
$value = $_GET['location']; // Wert dieser Spalte
$csv = array_map("str_getcsv", explode(PHP_EOL, $csv));
$keys = array_shift($csv);
$key = array_search($input, $keys);
while ($line = array_shift($csv)) {
if ($line[$key] == $value) {
echo implode(',', $line) . PHP_EOL;
}
}