Qhiliqq
Qhiliqq

Reputation: 83

PHP CSV duplicate values

I've got a csv file which contains product datas and prices from two distributors. There are 67 keys in this file. Now I want to search all EANs in this file which are twice available and then get the cheapest price. After that delete the other higher price product line. The CSV has a key for my merchant.

I made a test csv for easier view:

artno;name;ean;price;merchant
1;ipad;1654213154;499.00;merchant1
809;ipad;1654213154;439.00;merchant2
23;iphone;16777713154;899.00;merchant2
90;iphone;16777713154;799.00;merchant1

After the script runs through, the csv should look like (writing to new file):

artno;name;ean;price;merchant
809;ipad;1654213154;439.00;merchant2
90;iphone;16777713154;799.00;merchant1

I played around with fgetcsv, looping through the csv is not a problem, but how I can search for the ean in key 2?

$filename = './test.csv';
$file = fopen($filename, 'r');
$fileline = 1;

while (($data = fgetcsv($file, 0, ";")) !== FALSE) {
if($fileline == "1"){ $fileline++; continue; }


$search      = $data[2];
$lines       = file('./test.csv');
$line_number = false;

$count = 0;
while (list($key, $line) = each($lines) and !$line_number) {
   $line_number = (strpos($line, $search) !== FALSE) ? $key : $line_number;
   $count++;
}

if($count > 2){ 
    echo "<pre>",print_r(str_getcsv($lines[$line_number], ";")),"</pre>";
}

}

Upvotes: 3

Views: 441

Answers (1)

ROOT
ROOT

Reputation: 11622

I think this is what you are looking for:

<?php
$filename = './test.csv';
$file = fopen($filename, 'r');
$lines = file('./test.csv');
$headerArr = str_getcsv($lines[0], ";");

$finalrawData = [];
$cheapeastPriceByProduct = [];
$dataCounter = 0;

while (($data = fgetcsv($file, 0, ";")) !== FALSE) {
  if($dataCounter > 0) {
    $raw = str_getcsv($lines[$dataCounter], ";");
    $tempArr = [];
    foreach( $raw as $key => $val) {
      $tempArr[$headerArr[$key]] = $val;
    }
    $finalrawData[] = $tempArr;
  }
  $dataCounter++;
}

foreach($finalrawData as $idx => $dataRow ) {
  if(!isset($cheapeastPriceByProduct[$dataRow['name']])) {
    $cheapeastPriceByProduct[$dataRow['name']] = $dataRow;
  }
  else {
    if(((int)$dataRow['price'])< ((int)$cheapeastPriceByProduct[$dataRow['name']]['price'])) {
      $cheapeastPriceByProduct[$dataRow['name']] = $dataRow;
    }
  }
}

echo "<pre>";
print_r($finalrawData);
print_r($cheapeastPriceByProduct);

I just added $finalData data array to store the parsed data and associated all rows with their header key counterpart then you can compare and filter data based on your criteria.

Upvotes: 3

Related Questions