2014-09-24 1 views
0

У меня есть файл CSV, который имеет данные строки за строкой. Сценарий состоит в том, что 2 из моих столбцов имеют одинаковые значения все время.Как получить значения CSV на основе уникального столбца (если уникальный столбец нашел цикл его некоторых столбцов)

Предположим, если в строке 1 столбец 0 и столбец 1 имеют одно и то же значение, просто сохраните его в массиве с его другими значениями, которые я хочу выполнить.

На следующей итерации он проверяет, существуют ли значения столбца 0 и столбца 1 в предыдущем массиве, поэтому первый столбец цикла и данные столбца для нового массива до столбцов предшествующих строк 0 и столбца 1 имеют разные значения.

Вот файл данных CSV:

PickTicketNumber OrderNumber LineItemUpc LineItemUnitPrice LineItemQuantity                                                  
218837 204127 LR8025BLKMD 58 4                                                 
218837 204127 LR8025BLKLG 58 3                                                 
218837 204127 LR8475HEASM 54 1                                                 
218837 204127 LR8770ROYLG 53 1                                                 
218838 204128 LR8475HEAXS 54 1                                                 
218838 204128 LR8475HEASM 54 2                                                 
218838 204128 LR8475HEAMD 54 2                                                 
218838 204128 LR8475HEALG 54 1                                                 
218838 204128 LR8917BLKXS 58 1                                                 
218838 204128 LR8917BLKSM 58 1                                                 
218838 204128 LR8917BLKMD 58 1                                                 
218838 204128 LR8917BLKLG 58 1                                                 
218838 204128 LR6382BLKXS 48 1                                                 
218838 204128 LR6382BLKSM 48 2                                                 
218838 204128 LR6382BLKMD 48 2                                                 
218838 204128 LR6382BLKLG 48 1                                                 
218838 204128 LR8475BLKSM 54 2                                                 
218838 204128 LR8475BLKMD 54 2                                                 
218838 204128 LR8475BLKLG 54 1                                                 
218839 204130 LR8878HEAXL 63 1 

Как его ясно здесь, 218837 204127 существует в 4 раза, так что я просто хочу, это один раз, и цикл его LineItemUpc LineItemUnitPrice LineItemQuantity.

В конечном итоге я хотел бы видеть результат таким образом:

218837 204127 

один раз только, и если снова она существует в следующей строке так цикла его LineItemUpc LineItemUnitPrice LineItemQuantity снова. Средства в петле я хочу:

LR8025BLKMD 58 4                                                 
LR8025BLKLG 58 3                                                 
LR8475HEASM 54 1                                                 
LR8770ROYLG 53 1 

То же самое для остальной части элементов.

Означает один элемент PickTicketNumber OrderNumber и зацикливает все их значения в следующих рядах, имеющих тот же номер OrderTumber пакета PickTicketNumber, до тех пор, пока новый номер OrderTumber пакета PickTicketNumber не появится с новым номером OrderTumber набора номера.

В конце концов мой окончательный результат будет:

<reference>218837/204127</reference> 
      <line>LR8025BLKMD</line> 
       <price>58<price> 
       <qty>3<qty> 
      <line>LR8025BLKLG</line> 
       <price>58<price> 
       <qty>1<qty> 
      <line>LR8475HEASM</line> 
       <price>54<price> 
       <qty>1<qty> 
      <line>LR8770ROYLG</line> 
      <price>53<price> 
      <qty>1<qty> 
+0

Вы пробовали что-нибудь? – 2014-09-24 20:59:38

+0

Неясно, каков будет конечный результат. Будет ли это многомерный массив? Можете ли вы разместить массив здесь, как он должен выглядеть в конце? – vrijdenker

+0

@vlzvl Да, я сначала пробовал себя, поэтому я поставил свою логику здесь. Я использовал массивы, но мне не повезло. – 2014-09-24 21:00:48

ответ

0

Я все еще не уверен, что вы хотите в качестве конечного результата, но я надеюсь, что это получает вы собираетесь:

<?php 

$result = array(); 

if (($handle = fopen("test.csv", "r")) !== FALSE) { 
    $row = 0; 
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
     // Create a unique key based on the first two fields 
     $unique = $data[0] . '-' . $data[1]; 

     // Test if this key already exists in the array. If not, create it. 
     if (!array_key_exists($unique, $result)) { 
      $result[$unique] = array(
       'PickTicketNumber' => $data[0], 
       'OrderNumber' => $data[1], 
       'Data' => array(), 
      ); 
     } 

     // Append the actual data (all columns except the first two) 
     $result[$unique]['Data'][] = array_slice($data, 2); 
    } 
    fclose($handle); 
} 

echo "<pre>".print_r($result,1)."</pre>"; 

Этот должен дать что-то вроде:

Array(
    '218837-204127' => Array(
     'PickTicketNumber' => 218837, 
     'OrderNumber' => 204127, 
     'Data' => Array(
      array('LR8...MD',58,4), 
      array('LR80..LG',58,3), 
      etc. 
     ) 
    ), 
    '218838-204128' => Array(
     etc. 
    ), 
) 

Я надеюсь, что ответит на ваш вопрос.

+0

большое спасибо, один проблема. Он не выводил первую запись: 'LR8025BLKMD 4' – 2014-09-24 21:36:51

+0

означает, что он пропускает первый результат. Он печатает только 3, когда он должен 4. – 2014-09-24 21:37:47

+0

Это потому, что я предположил, что первой записью были имена столбцов. Вам нужно будет удалить строки с надписью «пропустить первую строку». (Я отредактирую свой пост) – vrijdenker

Смежные вопросы