2010-10-20 6 views
4

Можно создать дубликат:
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 
             ) 

           ) 

         ) 

       ) 

     ) 

) 
+1

Ваш вопрос не имеет смысла. Файлы .txt не имеют структуры. –

+0

Можете ли вы показать свой выход .txt? – pltvs

+1

'file_puts_contents ('file.txt', print_r ($ array, true));' – Petah

ответ

10

Если вы хотите он должен быть обработан, вы можете использовать

  • var_export - Выводит или возвращает строку с строкой re представление переменного

Пример

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

Если вы хотите, чтобы выглядеть на свой вопрос, вы передаете TRUE как вторые пары для print_r:

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

EDIT Вы упомянули в комментариях, что вы хотите, чтобы массив преобразовывался в файл CSV. Это сложнее. Ваш массив вложен, в то время как CSV-файл представляет собой в основном один малый массив, например.

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

будет эквивалентен CSV-файлу, где первые строки - это ключи массива, а вторая строка - значения.

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

Отдельные тускнеет массивы, как правило, в другом массиве, поэтому у вас есть коллекции, как это:

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.

+0

Несомненно, вы не хотите передавать true в качестве второго аргумента в var_export, поскольку он экспортирует его в vairable, а не выводит содержимое? – Alex

+0

@Alex Я хочу передать его 'file_put_contents', чтобы его можно было записать в файл. Для этого мне нужно использовать TRUE. – Gordon

+0

Благодарю вас за сообщение, это мне очень помогает, но проблема с вашим кодом немного. Похоже, что [countryCode] => AU не появляется, вместо этого он заменит [countryCode] => PH из массива продукта. Вот что я получаю: 156456; 110631; testing2; 15656; PH; 2; .... и т. Д. 315456; 321321; тестирование; 3213; PH; 2 .... и т. Д. – rayss

1

Может быть, что вы хотите fputcsv?

+1

Не со структурой, которая сложна. –

+0

Итак, какую структуру вы хотите? – MatTheCat

7

Если вы хотите сохранить переменную в текстовом файле, вы можете использовать функции по 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); 
Смежные вопросы