0

我使用创建了一个数组

    $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

所以它会在列出下一个项目之前列出所有附加到特定支票号码的 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) array(1075) { [0]=> string(8) "10182997" [1]=> string(8) "10190313" [2] 时数组的样子=> 字符串(8)“10190314”[3]=> 字符串(8)“10190315”等。

4

2 回答 2

1

我提供了一个未经测试的解决方案,因此请自行决定使用。

我已经尽力通过代码中的注释来解释一切。

  1. 从 sku 数组中删除第一个 sku 值,将其分配给第一行。

  2. 根据线路键将其他 sku 添加到临时数组中。

  3. 检查临时 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;
}
于 2013-04-15T15:45:44.497 回答
0

我认为 CSV 不太适合您将要做的事情。我会使用 json 或 xml。但是,您可以选择与 csv 分隔符不同的分隔符来表示数组,如下所示:

foo,bar1;bar2;bar3,...

什么将代表以下记录:

$record = array (
   'foo',
   array ('bar1', 'bar2', 'bar3')
);
于 2013-04-15T15:20:22.410 回答