程序1和程序2应该输出相同的值,但它们不是。为什么?如何在创建数组变量之前为其赋值?
<?php
echo "Program 1.<br>";
$col = array(1,3);
$data = array("123,234,345,456,567", "234,345,456,567,678");
$resultfinal = "";
for($i=0; $i<count($data); ++$i){
$tempdata = explode(',',$data[$i]);
for($j=0; $j<count($col); ++$j){
$resultfinal .= ",".$tempdata[$col[$j]];
}
$resultfinal .= "<br>";
}
echo $resultfinal;
echo "Program 2.<br>";
$resultfinal2 = "";
$resultsub = "";
for($j=0; $j<count($col); ++$j){
$resultsub .= ",".$tempdata2[$col[$j]];
}
for($i=0; $i<count($data); ++$i){
$tempdata2 = explode(',',$data[$i]);
$resultfinal2 .= $resultsub."<br>";
}
echo $resultfinal2;
?>
输出:
Program 1.
,234,456
,345,567
Program 2.
error...
答案 0 :(得分:0)
你无法以这种方式节省CPU时间。
稍微考虑一下:您需要处理来自$data
的所有项目(1个循环超过$data
)。对于$data
中的每个项目,您需要将其分解为多个部分,然后提取其索引存储在$col
中的值。这是$col
的每个项的另一个循环(超过$data
)。
执行此操作的唯一方法是使用两个嵌套循环(外部循环覆盖$data
,内循环覆盖$col
),就像在程序1中一样。
如果您真的担心节省CPU时间(不是真正关心中小数据量),您可以尝试使用更少的PHP代码和更多internal PHP array functions(以移动循环和尽可能多的处理可以进入PHP的本机代码):
这是一个可能的解决方案:
// For array_intersect_key() we need an array having the values of $col as keys
$columns = array_combine($col, $col);
// Store the generated lines here
$output = array();
// The outer loop over $data
foreach ($data as $item) {
// Explode the item into pieces
$pieces = explode(',', $item);
// Move the inner loop into PHP native code; array_intersect_key() keeps
// from $pieces the values having the same keys as $columns
// implode() joins the extracted pieces back into a string
$output[] = implode(',', array_intersect_key($pieces, $columns));
}
// Join the lines with <br>, output them
echo(implode("<br>\n", $output));