从STDIN读取不同行上的变量的简单方法?

时间:2016-02-14 11:10:56

标签: php

我想在两行读取两个整数,如:

4
5

此代码有效:

fscanf(STDIN,"%d",$num);
fscanf(STDIN,"%d",$v);

但我想知道是否有更短的方式来写这个? (对于更多变量,我不想为每个变量写一个语句)例如:

//The following two lines leaves the second variable to be NULL
fscanf(STDIN,"%d%d",$num,$v);
fscanf(STDIN,"%d\n%d",$num,$v);

更新:我使用答案中提供的方法解决了这个问题,读取数组并list从数组中分配变量。

2 个答案:

答案 0 :(得分:2)

考虑这个例子:

<?php

$formatCatalog = '%d,%s,%s,%d';

$inputValues = [];
foreach (explode(',', $formatCatalog) as $formatEntry) {
  fscanf(STDIN, trim($formatEntry), $inputValues[]);
}

var_dump($inputValues);

执行和喂食时
1
foo
bar
4

你会得到这个输出:

array(4) {
  [0] =>
  int(1)
  [1] =>
  string(3) "foo"
  [2] =>
  string(3) "bar"
  [3] =>
  int(4)
}

底线:你当然可以使用循环或类似的东西,这可以缩短你的代码。最重要的是它简化了维护。但是,如果要指定每次迭代时要读取的格式,则需要在某处指定该格式。这就是缩短代码的原因......

如果您想要处理不同类型的输入格式,情况会有所不同。在这种情况下,您可以使用通用循环:

<?php

$inputValues = [];
while (!feof(STDIN)) {
  fscanf(STDIN, '%d', $inputValues[]);
}

var_dump($inputValues);

现在,如果你用

喂它
1
2
3

在标准输入上然后分离输入(例如按CTRL-D),然后你得到的输出是:

array(3) {
  [0] =>
  int(1)
  [1] =>
  int(2)
  [2] =>
  int(3)
}

相同的代码显然可用于输入重定向,因此您可以将文件提供给脚本,这使得分离标准输入过时...

答案 1 :(得分:1)

如果你可以在你的代码中尝试实现一个数组:

fscanf(STDIN, "%d\n", $n);

$num=array();
while($n--){
    fscanf(STDIN, "%d\n", $num[]);
}
print_r($num);