使用php在csv文件中显示数组内部的数组

时间:2013-04-15 15:16:42

标签: php csv

我使用

创建了一个数组
    $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”等。

2 个答案:

答案 0 :(得分:1)

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

我已尽力通过代码中的评论来解释所有内容。

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

  2. 根据线路键将额外的skus添加到临时数组中。

  3. 检查临时sku数组,并从中创建其他行。

  4. 您的最终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')
);