我有一个存储在通过输入
获得的变量中的文件列表$users = array();
$stmt = $mysqli->query('SELECT id, last_active FROM users WHERE status = 1');
while ($row = $stmt->fetch_assoc()) {
$tempArray = []; // added
$tempArray[] = $row['id'];
$tempArray[] = $row['last_active'];
$users[] = $tempArray; // added
}
echo json_encode($users);
我想创建一个循环的for循环:前200个元素,元素201-400,元素401-578,例如。
我怎样才能做到这一点?我试过像
这样的东西$users[] = array($row['id'],$row['last_active']);
但显然这不起作用。
答案 0 :(得分:4)
建议不要使用变量填充文件列表。最好的方法是使用数组!
您需要通过执行shopt -s nullglob
来启用shell选项以避免空全局扩展,这样如果没有找到文件,则for循环将正常退出。下面的示例显示了一次迭代200个文件。您可以根据需要更改索引,以便在for循环中根据需要打印200-400和400-600。
shopt -s nullglob
files=(*.fasta)
if (( "${#files}" >= 200 )); then
for ((i=0; i<200; i++)); do
printf '%s\n' "${files[i]}"
done
fi
答案 1 :(得分:1)
将它们放在一个数组中,然后使用子字符串扩展来获取批量文件。
files=(./*.fasta)
for ((i=0; i< ${#fasta[*]}; i+=200)); do
process "${files[@]:i:200}" &
done
答案 2 :(得分:0)
问题可能有所不同。您可以使用find
和xargs
:
find * -name '*.fasta' -maxdepth 0 -print0 | xargs -0 -n 200 -P 0 echo
find
将每个文件名传递给xargs
,后者又为每200个输入文件(-P 0
)生成一个进程(-n 200
)。
这个单行使用-print0
和-0
标记,以防您的文件名包含空格。
在这种情况下,for循环结构不太理想。
或者,您可以使用while循环和内置的readarray:
find * -name '*.fasta' -maxdepth 0 | while readarray -n 3 a && [[ ${#a} -ne 0 ]]
do
echo ${a[@]}
done