I am very new to PHP (coming from JS) so am having trouble debugging this issue.
I have imported a .csv
to render to a html table and am trying to retrieve a column so I can order the table. The table contains 5 headings (Date, TransactionNumber, CustomerNumber, Reference, Amount). I can retrieve all of the values except the Date
column. That just returns an empty value.
<?php
$rows = array_map('str_getcsv', file('BankTransactions.csv'));
$header = array_shift($rows);
$csv = array();
foreach ($rows as $row) {
$csv[] = array_combine($header, $row);
}
print_r($csv[0]['Date']);
print_r("\n")
?>
// .csv
Date,TransactionNumber,CustomerNumber,Reference,Amount
2016年12月10日 1:54PM,NUF5V6PT3U,5156,Purchase at JB HiFi,-2498
2016年12月4日 4:54AM,J82964EFPS,2347,Refund,5424
2016年12月12日 5:25PM,ZUFBQGCKTK,5683,Fee Refund,254
2016年12月01日 12:00AM,XHNCASYLBR,2347,Purchase at Coles,-8873
2016年11月23日 10:34PM,S98EBHDWG3,3423,Wages,198700
2017年09月23日 9:34AM,MPNQYKVJ3G,4657,Purchase at Chemist Warehouse,-584
2015年11月23日 10:34PM,74CQKEGSHB,2173,Refund,-3514
2015年11月23日 10:35PM,WPTJMNVH4U,4527,Purchase at Hungry Monkey,45245
2017年01月01日 12:00AM,U6BD3M75FD,7577,Interest,2778
// Array received from `.csv`
Array
(
[0] => Array
(
[Date] => 2016年12月10日 1:54PM
[TransactionNumber] => NUF5V6PT3U
[CustomerNumber] => 5156
[Reference] => Purchase at JB HiFi
[Amount] => -2498
)
[1] => Array
(
[Date] => 2016年12月4日 4:54AM
[TransactionNumber] => J82964EFPS
[CustomerNumber] => 2347
[Reference] => Refund
[Amount] => 5424
)
[2] => Array
(
[Date] => 2016年12月12日 5:25PM
[TransactionNumber] => ZUFBQGCKTK
[CustomerNumber] => 5683
[Reference] => Fee Refund
[Amount] => 254
)
[3] => Array
(
[Date] => 2016年12月01日 12:00AM
[TransactionNumber] => XHNCASYLBR
[CustomerNumber] => 2347
[Reference] => Purchase at Coles
[Amount] => -8873
)
[4] => Array
(
[Date] => 2016年11月23日 10:34PM
[TransactionNumber] => S98EBHDWG3
[CustomerNumber] => 3423
[Reference] => Wages
[Amount] => 198700
)
[5] => Array
(
[Date] => 2017年09月23日 9:34AM
[TransactionNumber] => MPNQYKVJ3G
[CustomerNumber] => 4657
[Reference] => Purchase at Chemist Warehouse
[Amount] => -584
)
[6] => Array
(
[Date] => 2015年11月23日 10:34PM
[TransactionNumber] => 74CQKEGSHB
[CustomerNumber] => 2173
[Reference] => Refund
[Amount] => -3514
)
[7] => Array
(
[Date] => 2015年11月23日 10:35PM
[TransactionNumber] => WPTJMNVH4U
[CustomerNumber] => 4527
[Reference] => Purchase at Hungry Monkey
[Amount] => 45245
)
[8] => Array
(
[Date] => 2017年01月01日 12:00AM
[TransactionNumber] => U6BD3M75FD
[CustomerNumber] => 7577
[Reference] => Interest
[Amount] => 2778
)
)
2 Answers 2
Your CSV file is probably encoded in UTF-8 with a BOM, Byte Order Mark.
PHP does (still) not handle BOMs properly when reading files, so the very first line you read from the file will still contain it at the start, and therefor the first column value will also still contain it. So your key inside the $csv
array is not actually Date
, but [BOM]Date
, but you don’t see that in the print_r output (a BOM isn’t actually "visible" per se.)
See How to remove multiple UTF-8 BOM sequences or https://gist.github.com/chrisguitarguy/6096271 for suggestions how the BOM can be removed.
You need to fetch the transaction for each field. Here: https://www.php.net/manual/en/function.fgetcsv.php
I am using the exact same CSV file and made a solution for an interview. The CSV file's can be tested on the below link: https://paduademo.azurewebsites.net/
<?php foreach ($transactions as $transaction) : ?>
<tr>
<td><?php echo $transaction['Date']; ?></td>
<td><?php echo $transaction['TransactionNumber']; ?></td>
<td><?php echo ($transaction['Valid'])? 'Yes': 'No'; ?></td>
<td><?php echo $transaction['CustomerNumber']; ?></td>
<td><?php echo $transaction['Reference']; ?></td>
<td><span class="<?php echo ($transaction['type'] == 'Credit')? 'text-danger': 'text-success'; ?>"><?php echo (($transaction['type'] == 'Credit')? '-': '') . '$' . $transaction['Amount']; ?></span></td>
</tr>
<?php endforeach; ?>
The screenshot is below: Using the BankTransaction.csv
-
Ha ha. Looks like you will be getting the job. My final solution was way below that.Tristan– Tristan2020年03月19日 03:45:00 +00:00Commented Mar 19, 2020 at 3:45
2016年12月10日 1:54PM
as output. Could you please seterror_reporting(E_ALL);
in order to see is there any errors?2016年12月10日 1:54PM
date as output.error_reporting
?Date
, but[BOM]Date
, but you don’t see it in the print_r output. (See stackoverflow.com/questions/10290849 or gist.github.com/chrisguitarguy/6096271 for suggestions how the BOM can be removed.)