2

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
 )
)
asked Mar 12, 2020 at 9:06
11
  • 3
    Strange because using your code (just copy/paste), I got 2016年12月10日 1:54PM as output. Could you please set error_reporting(E_ALL); in order to see is there any errors? Commented Mar 12, 2020 at 9:12
  • I got also 2016年12月10日 1:54PM date as output. Commented Mar 12, 2020 at 9:13
  • This is disappointing. Its a literal copy paste from my IDE. @mitkosoft where do I set that error_reporting? Commented Mar 12, 2020 at 9:16
  • @Tristan, paste this line on the very top of your page that contains this script. Is there any other PHP code there that may cause a problem, or that's all btw? Commented Mar 12, 2020 at 9:17
  • 3
    Guess: Your CSV file is probably encoded in UTF-8 with a BOM? PHP does not handle BOMs properly, 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. Your key inside the $csv array is not actually 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.) Commented Mar 12, 2020 at 9:28

2 Answers 2

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.

answered Mar 12, 2020 at 10:29
0

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

answered Mar 17, 2020 at 11:45
1
  • Ha ha. Looks like you will be getting the job. My final solution was way below that. Commented Mar 19, 2020 at 3:45

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.