我使用
创建了一个数组 $processed[$y] = array('source' => $source,
'check total' => number_format($checkTotal, 2, '.', ''),//($rows['total'], 2, '.', ''),
'check number' => $num,
'table' => $invTable,
'skus' => $skuArray,
'check amount' => number_format($amount, 2, '.', '')
);
$y++;
我的$ skuArray是一个数组,其中包含与特定支票号相关联的所有sku。我试图让它显示如下:
source check total check number table skus check amount
MNC 152.32 649 inv_temp 10198547 152.32
10195874
所以它会在列出下一个项目之前列出附加到特定检查nuimber的所有sku。
这是我将$ processed转换为csv文件的函数:
function to_csv( $array ) {
$csv = "";
if (count($array) == 0) return "No Processed checks found";
## Grab the first element to build the header
$arr = array_pop( $array );
$temp = array();
foreach( $arr as $key => $data ) {
$temp[] = $key;
}
$csv = implode( ',', $temp ) . "\r\n";
## Add the data from the first element
$csv .= to_csv_line( $arr );
## Add the data for the rest
foreach( $array as $arr ) {
$csv .= to_csv_line( $arr );
}
return $csv;
}
function to_csv_line( $array ) {
$temp = array();
foreach( $array as $elt ) {
$temp[] = '"' . addslashes( $elt ) . '"';
}
$string = implode( ',', $temp ) . "\r\n";
return $string;
}
我怎样才能做到这一点?我尝试过使用数组('skus => $ skuArray),但它只是在结果中给了我“数组”。
更新:这是我做var_dump($ skuArray)时数组的样子 数组(1075){[0] => string(8)“10182997”[1] => string(8)“10190313”[2] => string(8)“10190314”[3] => string(8)“10190315”等。
答案 0 :(得分:1)
我提供了未经测试的解决方案,因此请自行决定使用。
我已尽力通过代码中的评论来解释所有内容。
从sku数组中删除第一个sku值,将其指定给第一行。
根据线路键将额外的skus添加到临时数组中。
检查临时sku数组,并从中创建其他行。
您的最终to_csv
函数将如下所示:
function to_csv( $array ) {
$csv = "";
if (count($array) == 0) return "No Processed checks found";
## Grab the first element to build the header
$arr = $array[0];
$temp = array();
foreach( $arr as $key => $data ) {
$temp[] = $key;
}
$csv = implode( ',', $temp ) . "\r\n";
## Process each line
foreach( $array as $arr ) {
## Check for multiple sku values. Create a temporary array for them to add them after this line.
if(isset($arr['skus']) && is_array($arr['skus']))
{
//Remove the first value (since we only need it for the actual line item)
$sku_value = $arr['skus'][0];
unset($arr['skus'][0]);
//Create temporary lines for each sku
$temp_sku_arrays = array();
foreach($arr['skus'] as $sku)
{
$sku_array = array();
foreach($arr as $key => $value)
{
//Set only the sku key with a value.
$sku_array[$key] = ($key == 'skus' ? $sku : '');
}
$temp_sku_arrays[] = $sku_array;
}
//Set the first line to the first sku value.
$arr['skus'] = $sku_value;
}
$csv .= to_csv_line( $arr );
//Check for additional sku lines, then add them
if(isset($temp_sku_arrays) && is_array($temp_sku_arrays))
{
foreach($temp_sku_arrays as $sku_array)
{
$csv .= to_csv_line( $sku_array );
}
unset($temp_sku_arrays);
}
}
return $csv;
}
答案 1 :(得分:0)
我认为CSV并不适合您将要做的事情。我会用json或xml。但是,您可以选择与csv sepator不同的分隔符来表示数组,如下所示:
foo,bar1;bar2;bar3,...
代表以下记录:
$record = array (
'foo',
array ('bar1', 'bar2', 'bar3')
);