Reputation: 27
I'm trying to parse a CSV file and as part of it I would like to remove leading/trailing whitespace from all of my cells. Since it's a CSV file it's formatted like a 2D array. Initially I tried:
foreach($csv as $row){
foreach($row as $cell){
$cell = trim($cell);
}
}
However the result was untrimmed.
Next I tried using array_map as suggested here.
$csv = array_map('trim', $csv);
This gave me back an array of empty rows. So I also tried
foreach($csv as $row){
$row = array_map('trim', $row);
}
Which like my first attempt didn't change anything.
Here's the CSV data I'm using as my input:
First Name,Last Name,Contact Method,Phone, Email John,Doe,Email,1-XXX-XXX-XXXX, [email protected] Jane,Doe,Phone Call,1-XXX-XXX-XXXX,[email protected]
In particular I was trying to get my script to trim the leading space in the last cell of the first row (" Email" => "Email").
Upvotes: 0
Views: 1502
Reputation: 930
$input = [
'parent' => [
'child' => ' element to be trimmed '
]
];
array_walk_recursive($input, function (&$item) {
if (!is_array($item)) {
$item = trim($item);
}
});
Upvotes: 0
Reputation: 21661
If you are seeing it like you put here,
" Email" => "Email"
you'll have to trim it from the key, can you show how you are assigning the named headers. Because I would trim it there, but using array_map('trim', $data) will remove the whitespace, I do that all day long.
Well to just clean the keys you can do,
$keys = array_map( 'trim', array_keys($data) );
$data = array_combine( $keys, $data );
Upvotes: 0
Reputation: 16502
You are not modifying the original array when you do the trim. You should get the values by reference in the foreach
loop.
foreach($csv as &$row){
foreach($row as &$cell){
$cell = trim($cell);
}
}
From the documentation:
In order to be able to directly modify array elements within the loop precede $value with &. In that case the value will be assigned by reference.
Upvotes: 2
Reputation: 78984
You need to reference $row
in order to make changes to the array (note the &
):
foreach($csv as &$row){
$row = array_map('trim', $row);
}
Upvotes: 2