i have a csv-file where i have headings. the first column has a unique id.
im using following code for the output in arays and headings as keys:
function csv_to_array($filename='', $delimiter=',') {
if(!file_exists($filename) || !is_readable($filename))
return FALSE;
$header = NULL;
$data = array();
if (($handle = fopen($filename, 'r')) !== FALSE)
{
while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE)
{
if(!$header)
$header = $row;
else
$data[] = array_combine($header, $row);
}
fclose($handle);
}
return $data;
}
Now i get the output
Array
(
[0] => Array
(
[id] => 2548
[description ] => MyDescription
[value] => 5
)
[1] => Array
(
[id] => 2549
[description ] => MyDescription
[value] => 10
)
i want to put the "id" as key for the group array like
Array
(
[2548] => Array
(
[id] => 2548
[description ] => MyDescription
[value] => 5
)
[2549] => Array
but i cant call the id one group before.
You can just grab the ID first an put it into the $data array as an index. Do you want to keep the ID in the data? See the comments in the code
function csv_to_array($filename='', $delimiter=',') {
if(!file_exists($filename) || !is_readable($filename))
return FALSE;
$header = NULL;
$data = array();
if (($handle = fopen($filename, 'r')) !== FALSE)
{
while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE)
{
if(!$header)
$header = $row;
else{
$id = $row[0]; // grab the ID from the row / expectiong that the ID is in the first column of your CSV
//unset($row[0]); // <-- uncomment this line if you want to remove the ID from the data array
$data[$id] = array_combine($header, $row);
}
}
fclose($handle);
}
return $data;
}
Related
I am trying to create a multidimensional array using CSV file so that for example:
"a","b","c"
1,2,3
4,5,6
would return as:
array(
'a' => array(1, 4),
'b' => array(2, 5),
'c' => array(3, 6),
)
But the code I have:
<?php
function readCSV($csvFile) {
$aryData = [];
$header = NULL;
$handle = fopen($csvFile, "r");
if($handle){
while (!feof($handle)){
$aryCsvData = fgetcsv($handle);
if(!is_array($aryCsvData)){
continue;
}
if(is_null($header)){
$header = $aryCsvData;
}
elseif(is_array($header) && count($header) == count($aryCsvData)){
$aryData[] = array_combine($header, $aryCsvData);
}
}
fclose($handle);
}
return $aryData;
}
print_r(readCSV("Book1.csv"));
?>
Returns it as:
Array(
[0] => Array ( [a] => 1 [b] => 2 [c] => 3 )
[1] => Array ( [a] => 4 [b] => 5 [c] => 6 )
)
Would appreciate any help!
Instead of building the end array as you go along. This code reads the header row before the loop, then just reads all of the data lines into another array. It then combines each element of the header array with the matching column from the data array (using array_column() and the position of the header element)...
function readCSV($csvFile) {
$aryData = [];
$output = [];
$header = NULL;
$handle = fopen($csvFile, "r");
if($handle){
$header = fgetcsv($handle);
while ($aryData[] = fgetcsv($handle));
foreach ( $header as $key=>$label) {
$output[$label] = array_column($aryData, $key);
}
fclose($handle);
}
return $output;
}
Read the first row of the file and create the associative array with empty columns. Then read each remaining row and loop through it, pushing the values onto the column arrays.
<?php
function readCSV($csvFile) {
$aryData = [];
$handle = fopen($csvFile, "r");
if($handle){
$headerRow = fgetcsv($handle);
if (!$headerRow) {
return $aryData;
}
foreach ($headerRow as $colname) {
$aryData[$colname] = [];
}
while ($aryCsvData = fgetcsv($handle)){
foreach ($headerRow as $colname) {
$aryData[$colname][] = each($aryCsvData);
}
}
fclose($handle);
}
return $aryData;
}
I'm trying to get a useable array.
This is what I did to get the following array from my .csv file.
$csv = array_map('str_getcsv', file($file));
array_walk($csv, function(&$a) use ($csv) {
$a = array_combine($csv[0], $a);
});
array_shift($csv);
Right now I've got an array with these keys and values:
[0] => Array
(
[Label;Account;Registered;Licensed;User;UserLicense] => Test;Test;No;No;test;no;
)
And I want to get an array like:
[0] => Array
(
[Label] => Test
[Account] => Test
[Registered] => No
[Licensed] => No
[User] => test
[UsreLicense] => no
)
Can anyone help me?
Thanks.
class arrCsv {
private $arr;
private function getValFromArray($item, $key) {
$arrKeys = explode(';', $key);
$arrVal = explode(';', $item);
array_pop($arrVal); // remove last empty item
$this->arr[] = array_combine($arrKeys, $arrVal);
}
function setNewArr($arItems) {
array_walk_recursive($arItems, array($this, 'getValFromArray'));
}
function getNewArr() {
return $this->arr;
}
}
$r = new arrCsv;
$r->setNewArr($csvArray);
$vals = $r->getNewArr();
The answer I found:
$usersCsv = array();
if (($handle = fopen($file, "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
$usersCsv[] = $data;
array_walk($usersCsv, function(&$a) use ($usersCsv) {
$a = array_combine($usersCsv[0], $a);
});
}
fclose($handle);
array_splice($usersCsv, 0, 1);
}
Thanks for the help anyways!
So I have this code:
<?php
$csv = array();
$lines = file('file.csv', FILE_IGNORE_NEW_LINES);
foreach ($lines as $key => $value)
{
$csv[$key] = str_getcsv($value);
}
echo '<pre>';
print_r($csv);
echo '</pre>';
?>
which gives me the following
[0] => Array
(
[0] => value1
[1] => value2
[2] => value3
[3] => value4
How can I name my keys? so I don't see 0-1-2-3 but Name1-Name2-Name3 etc.
Like This:
[0] => Array
(
[Name0] => value1
[Name1] => value2
[Name2] => value3
[Name3] => value4
function csvToArray($filename, $delimiter = ',') {
if (!file_exists($filename) || !is_readable($filename)) {
return FALSE;
}
$header = NULL;
$data = array();
if (($handle = fopen($filename, 'r')) !== FALSE) {
while (($row = fgetcsv($handle, 0, $delimiter)) !== FALSE) {
if (count($row) > 0 && !is_null($row[0])) {
if (!$header) {
$header = $row;
} else {
$data[] = array_combine($header, $row);
}
}
}
fclose($handle);
}
return $data;
}
Try this function
$filename is the full path to the file
also add in csv as first line keys you want to have and function will use this first line for keys
csv example:
"id","country","city"
"1","us","abanda"
"2","us","abbeville"
Now I understand!
All you need to do in this case is concatenate a string literal onto the front of the key that you generate, like this :-
<?php
$csv = array();
$lines = file('file.csv', FILE_IGNORE_NEW_LINES);
foreach ($lines as $key => $value)
{
$csv['Name'.$key] = str_getcsv($value);
}
echo '<pre>';
print_r($csv);
echo '</pre>';
?>
$keys = ['Name1', 'Name2', 'Name3', 'etc'];
$csv[$key] = array_combine($keys, str_getcsv($value));
This worked
Thanks Mark Baker
I have been trying to get the value of my combined rate, but running into some trouble with simply getting the value :
Array ( [0] => Array ( [ZipCode] => 01014 [CombinedRate] => 0.0625 ) ) <--- this is the array that is printed.
Here is the full code:
<?php
function csv_to_array($filename= '', $delimiter=',')
{
if(!file_exists($filename) || !is_readable($filename))
return FALSE;
$header = NULL;
$data = array();
if (($handle = fopen($filename, 'r')) !== FALSE)
{
while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE)
{
if(!$header)
$header = $row;
else
$data[] = array_combine($header, $row);
}
fclose($handle);
}
return $data;
}
$zipsearch = csv_to_array($_SERVER['DOCUMENT_ROOT'].'/textfiles/taxes.csv');
function search($array, $key, $value)
{
$results = array();
if (is_array($array)) {
if (isset($array[$key]) && $array[$key] == $value) {
$results[] = $array;
}
foreach ($array as $subarray) {
$results = array_merge($results, search($subarray, $key, $value));
}
}
return $results;
}
$valueofzip = search( $zipsearch, 'ZipCode', '01014');
print_r($valueofzip)
/*
Need Code To print Just value of that array
*/
?>
I just need the value of the combined rate after the zipcode is found from the array that is printed, but for whatever reason I am just missing it,
How do I just get the value of "Combined Rate" from this array that is printed : Array ( [0] => Array ( [ZipCode] => 01014 [CombinedRate] => 0.0625 ) )
Essentially this page will print out a single tax rate
It looks like the value that you are trying to retrieve is simply:
$valueofzip[0]['CombinedRate']
i.e. the value with the key "CombinedRate" in the zeroth element of $valueofzip.
If you are anticipating there being more than one array returned by your search function, then a foreach loop would be more appropriate:
foreach($valueofzip as $zip) {
if (isset($zip['CombinedRate'])) echo $zip['CombinedRate'];
}
Depending on exactly what you want to do with the value, you might also want to take a look at array_walk, array_map, etc. in the documentation. They can be used to traverse the array and apply a callback function to each element. For example:
$valueofzip = array(array("ZipCode" => 01014, "CombinedRate" => 0.0625),
array("ZipCode" => 02025, "CombinedRate" => 0.125 ));
$combined_rates = array_map(function($x) { if (isset($x['CombinedRate'])) return $x['CombinedRate']; }, $valueofzip));
print_r($combined_rates);
Output:
Array
(
[0] => 0.0625
[1] => 0.125
)
I know about fgetcsv, but it doesn't really do what I'm looking for.
I have the following csv file:
productId,productName,productActive
1,test product,1
2,test product2,0
I'm looking for something that will create an array that looks like this:
array (0)
['productId'] => 1
['productName'] => test product
['productActive'] => 1
array (1)
['productId'] => 2
['productName'] => test product2
['productActive'] => 0
any ideas?
// open the file.
if (($handle = fopen("in.csv", "r")) !== FALSE) {
// read the column headers in an array.
$head = fgetcsv($handle, 1000, ",");
// read the actual data.
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
// create a new array with the elements in $head as keys
// and elements in array $data as values.
$combined = array_combine($head,$data);
// print.
var_dump($combined);
}
// done using the file..close it,
fclose($handle);
}
See it
Try something like this:
$rows = array();
$headers = fgetcsv($file);
while($line = fgetcsv($file)) {
$row = array();
foreach($line as $key => $value) {
$row[$headers[$key]] = $value;
}
$rows[] = $row;
}
You would have to write your own function for that. It has all sorts of implicit requirements such as the first line being the key indices. If that's what you always want then you can do:
if (($handle = fopen("test.csv", "r")) !== FALSE) {
$row_headers = fgetcsv($handle);
$output = array();
//don't specify a limit to the line length (i.e. 1000).
//just grab the whole line
while (($data = fgetcsv($handle)) !== FALSE) {
$num = count($data);
$row++;
$row_array = array();
//For each column, create a row array with the index being
//the column heading and the data being the row data.
for ($c=0; $c < $num; $c++) {
$row_array[$row_headers[$c]] = $data[$c];
}
//Add each row to the output
$output[] = $row_array;
}
print_r($output);
}
Giving the result of:
Array ( [0] => Array ( [productId] => 1 [productName] => test product [productActive] => 1 ) [1] => Array ( [productId] => 2 [productName] => test product2 [productActive] => 0 ) )