代码之家  ›  专栏  ›  技术社区  ›  rayss

将数组转换为.txt文件[重复]

  •  4
  • rayss  · 技术社区  · 14 年前

    可能重复:
    Convert array into csv

    你好,

    如何将数组转换成.txt文件?

    这是我的阵列:

    Array
    (
        [OrderList_RetrieveByContactResult] => Array
            (
                [OrderDetails] => Array
                    (
                        [0] => Array
                            (
                                [entityId] => 156456
                                [orderId] => 110631
                                [orderName] => testing2
                                [statusTypeId] => 15656
                                [countryCode] => AU
                                [orderType] => 2
                                [invoiceNumber] => 1001
                                [invoiceDate] => 2010-10-19T00:00:00
                                [userID_AssignedTo] => 245454
                                [shippingAmount] => 8.95
                                [shippingTaxRate] => 0
                                [shippingAttention] => tttesst
                                [shippingInstructions] => this a test
                                [shippingOptionId] => 50161
                                [discountCodeId] => 0
                                [discountRate] => 0
                                [totalOrderAmount] => 143.8
                                [directDebitTypeId] => 0
                                [directDebitDays] => 0
                                [isRecur] => 
                                [nextInvoiceDate] => 0001-01-01T00:00:00
                                [endRecurDate] => 0001-01-01T00:00:00
                                [cycleTypeID] => 1
                                [createDate] => 2010-10-19T05:40:00
                                [lastUpdateDate] => 2010-10-19T05:40:00
                                [deleted] => 
                                [products] => Array
                                    (
                                        [Product] => Array
                                            (
                                                [productId] => 455
                                                [productCode] => 
                                                [productDescription] => testtest
                                                [units] => 3
                                                [unitPrice] => 44.95
                                                [unitTaxRate] => 0
                                                [totalProductPrice] => 134.85
                                                [productName] => Skin Support Tablets
                                            )
                                    )
    
                                [addresses] => Array
                                    (
                                        [Address] => Array
                                            (
                                                [addressTypeID] => 8
                                                [addressLine1] => Cebu
                                                [city] => City
                                                [zipcode] => 6000
                                                [state] => cebu
                                                [countryCode] => PH
                                            )
                                    )
    
                            )
    
                        [1] => Array
                            (
                                [entityId] => 315456
                                [orderId] => 321321
                                [orderName] => testing
                                [statusTypeId] => 3213
                                [countryCode] => AU
                                [orderType] => 2
                                [invoiceNumber] => 1002
                                [invoiceDate] => 2010-10-19T00:00:00
                                [userID_AssignedTo] => 11711
                                [shippingAmount] => 8.95
                                [shippingTaxRate] => 0
                                [shippingAttention] => 
                                [shippingInstructions] => 
                                [shippingOptionId] => 50161
                                [discountCodeId] => 0
                                [discountRate] => 0
                                [totalOrderAmount] => 408.45
                                [directDebitTypeId] => 0
                                [directDebitDays] => 0
                                [isRecur] => 
                                [nextInvoiceDate] => 0001-01-01T00:00:00
                                [endRecurDate] => 0001-01-01T00:00:00
                                [cycleTypeID] => 1
                                [createDate] => 2010-10-08T18:40:00
                                [lastUpdateDate] => 2010-10-19T18:36:00
                                [deleted] => 
                                [products] => Array
                                    (
                                        [Product] => Array
                                            (
                                                [productId] => 11564
                                                [productCode] => 
                                                [productDescription] => 
                                                [units] => 10
                                                [unitPrice] => 39.95
                                                [unitTaxRate] => 0
                                                [totalProductPrice] => 399.5
                                                [productName] => Acne Clearing Gel
                                            )
    
                                    )
    
                                [addresses] => Array
                                    (
                                        [Address] => Array
                                            (
                                                [addressTypeID] => 8
                                                [addressLine1] => Cebu City
                                                [city] => Cebu
                                                [zipcode] => 6000
                                                [state] => 
                                                [countryCode] => PH
                                            )
    
                                    )
    
                            )
    
                    )
    
            )
    
    )
    
    3 回复  |  直到 14 年前
        1
  •  11
  •   Gordon Haim Evgi    14 年前

    如果您希望它是可解析的,可以使用

    • var_export outputs or returns a parsable string representation of a variable

    示例

    file_put_contents('array.txt',var_export($array,true));
    < /代码> 
    
    

    如果您希望它在您的问题中看起来像,您可以将true作为第二个参数传递给print_r:。

    file_put_contents('array.txt',print_r($array,true));
    < /代码> 
    
    

    edit您在注释中提到希望将数组转换为csv文件。这更困难。您的数组是嵌套的,而csv文件基本上是单个dim数组,例如

    array('k1'=>'v1','k2'=>'v2',…,'kn'=>'vn');
    < /代码> 
    
    

    相当于一个csv文件,其中第一行是数组键,第二行是值。

    k1;k2;…;kn
    V1;V2;…
    < /代码> 
    
    

    单个DIMS阵列通常位于另一个阵列中,因此您有如下集合:

    数组(
    数组('k1'=>'v1'、'k2'=>'v2'、…,'kn'=>'vn'),
    数组('k1'=>'v1'、'k2'=>'v2'、…,'kn'=>'vn')
    ;
    < /代码> 
    
    

    在这里,您必须先获取键,然后只从数组中获取后续行的值,例如

    k1;k2;…;kn
    V1;V2;…
    V1;V2;…
    < /代码> 
    
    

    问题是,您的数组嵌套得更深。您将把地址放在哪里?唯一可行的方法是遍历数组,只获取包含标量类型的键和值,并线性化任何嵌套数组,例如

    数组(
    数组('k1'=>'v1'、'k2'=>'v2'、…,'kn'=>数组('skn'=>'svn')),
    数组('k1'=>'v1'、'k2'=>'v2'、…,'kn'=>数组('skn'=>'svn')),
    ;
    < /代码> 
    
    

    必须变成

    k1;k2;…;skn
    v1;v2;…;svn
    v1;v2;…;svn
    < /代码> 
    
    

    如果这还不清楚,这里有一个例子说明在哪里:

    幸运的是,这可以通过迭代器实现:

    $orderDetails=$array['orderList_retrieveByContactResult'][订单详细信息'];
    foreach($orderDetails as$key=>$details){
    
    $迭代器=新的递归迭代器(
    新的RecursiveArrayIterator($details));
    
    如果($key==0){
    $keys=array();
    foreach($iterator as$k=>$v){
    $密钥[] = $K;
    }
    echo内爆(“;”,$keys);
    }
    
    $values=array();
    foreach($iterator作为$val){
    $values[]=$val;
    }
    echo-php-eol,内爆(“;”,$values);
    }
    < /代码> 
    
    

    上面的代码应该输出所描述的格式。请参阅http://www.ideone.com/i70ddfor an example.

    要将其写入文件,您可以将其组装为字符串变量,然后一次将其全部组装为file_put_contentsit,或者使用文件指针并逐行写入。如果您不使用内爆it,但在扁平的数组上迭代,您也可以使用fputcsv

    变量的可分析字符串表示法

    例子

    file_put_contents('array.txt', var_export($array, TRUE));
    

    如果你想让它看起来像你的问题,你就通过了TRUE作为第二个参数print_r:

    file_put_contents('array.txt', print_r($array, TRUE));
    

    编辑您在注释中提到希望将数组转换为csv文件。这更困难。您的数组是嵌套的,而csv文件基本上是单个dim数组,例如

    array('k1' => 'v1', 'k2' => 'v2', ... , 'kn' => 'vn');
    

    相当于一个csv文件,其中第一行是数组键,第二行是值。

    k1; k2; ...; kn
    v1; v2; ...; vn
    

    单个DIMS阵列通常位于另一个阵列内,因此您有如下集合:

    array(
       array('k1' => 'v1', 'k2' => 'v2', ... , 'kn' => 'vn'),
       array('k1' => 'v1', 'k2' => 'v2', ... , 'kn' => 'vn')
    );
    

    在这里,您必须先获取键,然后只从数组中获取后续行的值,例如。

    k1; k2; ...; kn
    v1; v2; ...; vn
    v1; v2; ...; vn
    

    问题是,您的数组嵌套得更深。你会把它放在哪里?地址数组?唯一可行的方法是遍历数组,只获取包含标量类型的键和值,并线性化任何嵌套数组,例如。

    array(
       array('k1' => 'v1', 'k2' => 'v2', ... , 'kn' => array( 'skn' => 'svn' ) ),
       array('k1' => 'v1', 'k2' => 'v2', ... , 'kn' => array( 'skn' => 'svn' ) ),
    );
    

    必须变成

    k1; k2; ...; skn
    v1; v2; ...; svn
    v1; v2; ...; svn
    

    如果这不清楚,请举例说明:

    Flattening a Multidimensional Array for use in a CSV file

    幸运的是,这可以通过迭代器实现:

    $orderDetails = $array['OrderList_RetrieveByContactResult']['OrderDetails'];
    foreach( $orderDetails as $key => $details ) {
    
        $iterator = new RecursiveIteratorIterator(
                new RecursiveArrayIterator($details));
    
        if($key === 0) {
            $keys = array();
            foreach($iterator as $k => $v) {
                $keys[] = $k;
            }
            echo implode(';', $keys);
        }
    
        $values = array();
        foreach($iterator as $val) {
            $values[] = $val;
        }
        echo PHP_EOL, implode(';', $values);
    }
    

    上面的代码应该输出所描述的格式。见http://www.ideone.com/I70dD举个例子。

    要将其写入文件,可以将其组装为字符串变量,然后file_put_contents或者使用一个文件指针,一行一行地写。如果你不implode但重复$flattened数组,也可以使用fputcsv.

        2
  •  7
  •   Lekensteyn    14 年前

    如果要在文本文件中保存变量,可以使用 serialize() / unserialize() 功能:

    $data = array(1, 2, 3, '');
    $toBeSaved = serialize($data);
    file_put_contents('somefile.txt', $toBeSaved);
    

    恢复它…

    $toBeRestored = file_get_contents('somefile.txt');
    $data = unserialize($toBeRestored);
    
        3
  •  1
  •   MatTheCat    14 年前

    也许你想要的是 fputcsv ?