How to dynamically get column value from csv file using php - php

i have two columns in csv file Name and Phone . If i given phone number as a variable $searchStr = "6059574150"; it has to find number in csv file and i need that contact name to get access dynamicaly like this $data['Name'] instead of $data['0']
MY php code
$header = array();
$final_result = array();
$file = fopen('example.csv', 'r');
if($file){
$row = 1;
while ($data = fgetcsv($file, 10000, ",")){
if($row == 1){
$header = array_values($data);
}
else{
$final_result[] = array_combine($header, array_values($data));
}
$row++;
}
}
echo "<pre>";
print_r($final_result);
my output is like this
Array
(
[0] => Array
(
[Names] => MICHAEL
[Phone] => 6059342614
)
[1] => Array
(
[Names] => GLENN
[Phone] => 6056296061
)
)
how to directly access column ? like this $data['Name']

If phone numbers are unique, you could do something like this:
<?php
$final_result = array();
$file = fopen('example.csv', 'r');
if($file) {
$header = fgetcsv($file, 10000, ",");
while ($data = fgetcsv($file, 10000, ",")) {
$final_result[$data[1]] = $data[0];
}
}
?>
If you have more than one name (person) for each phone number, you can concatenate them $final_result[$data[1]] .= ',' . $data[0];.
Example result:
array (
phone1 => 'name1',
phone2 => 'name2',
phone3 => 'name3',
)
To search a name from a phone number you have to do: $final_result[phone_number] and you get the name.
In your output array "$final_result" you can look for a Name by phone number this way:
$foundKey = array_search('pone_number_to_search', array_column($final_result, "Phone"));
$foundNames = $final_result[$foundKey]["Names"];

Related

PHP CSV to associative array with top row as keys and columns as value arrays

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;
}

How can i convert txt file to array

I have this sort of structure on a txt file.
[FILE_INFO]
[FIRST]
LOAD1= CPU
LOAD2 = RAM
[END_FIRST]
[GLOBAL_INDEX]
ELEC1=1235.12
GAZ2,1=1563.123
GAZ2,2= 28.56
[END_GLOBAL_INDEX]
[END_FILE_INFO]
What i need is to convert this txt structure to a php array , is this possible or txt structure is know ?
Array
(
[FILE_INFO] => Array
(
[FIRST] => Array
(
[LOAD1] => CPU
[LOAD2] => RAM
)
[GLOBAL_INDEX] => Array
(
[ELEC1] => 1235.12
[GAZ2] => Array
(
[1] => 1563.123
[2] => 28.56
)
)
)
)
Here is my approach:
$txt_file = file_get_contents("test.rt");
$rows = explode("\n", $txt_file);
$new_array = array(); $dimension = array();
foreach($rows as $row =>$data)
{
if($data[0] == "[" && substr($data, 0, 4) != "[END"){ // start
$output = str_replace( array('[',']') , '' , $data );
array_push($dimension, trim($output));
continue;
}else if(substr($data, 0, 4) == "[END"){ // end
$output = str_replace( array('[',']') , '' , $data );
array_pop($dimension);
continue;
}
$dim="";
foreach($dimension as $k=>$v){
$dim.= "['$v']";
}
$new_array.$dim[] = $data; // this is not working !!!!!
}
The problem is to position my cursor in the dimension of the array and insert the data
Try this:
<?php
$myfile = fopen("test.txt", "r");
// Iterate one line until end-of-file
while(!feof($myfile)) {
$text[] = fgets($myfile); // Add the data in an array
}
fclose($myfile);
print_r($text); // print the array
?>

Give names to array keys

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

Explode using 2 delimiter for a single line

i need to upload a .txt file in database.
my .txt file is exactly looks like
Name|Code|Email|Designation|Number|Salary|Age\t
syed|101|syed#gmail.com|trainee|7222877798|6000|21\t
hari|102|hari#gmail.com|trainee|9554512582|6000|23\t
i have need to separate it with | and then \t.
while getting array, the first one achieved as what i expect. but i cant able make \t explode.. can any one help me on this forum??
my routine is described below
if ($_POST['frmSubmit']) {
$file = $_FILES['frmUpload']['tmp_name']; // Get Temporary filename
$handle = fopen($file,"r"); // Open the file and read
while($strBookData = fgets($handle, 4096)) { // To get Array from .txt
$strDatas[] = $strBookData;
$strTableColumn = count($strBookData);
}
$strDatas = explode("|",implode($strDatas));
printArray($strDatas); exit;
if ($strDatas) {
$strInsertRecords = 0;
$strDuplicationRecords = 0;
if ($strTableColumn == 7) {
for($k=1; $k<count($strDatas); $k++) { //$k=1 is initialized because $k[0] is a header field array.
$strStatus = doCheckDuplication($strDatas[$k]['2']);
if ($strStatus == 0) {
// Insert Code
$strData = $strDatas[$k];
doInsertEmployeeDetails($strData['0'], $strData['1'], $strDatas[$k]['2'], $strData['3'], $strData['4'], $strData['5'], $strData['6']);
$strInsertRecords++; // To Get Inserted Records Count.
} else {
$strDuplicationRecords++; // To Get Duplication Records Count.
}
}
}
}
Hi this will split the text you provided.
$text = 'Name|Code|Email|Designation|Number|Salary|Age\t
syed|101|syed#gmail.com|trainee|7222877798|6000|21\t
hari|102|hari#gmail.com|trainee|9554512582|6000|23\t';
//remove line endings
$text = str_replace(array("\r\n", "\r", "\n"), "", $text);
$rows = explode('\t', $text);
$data = array();
foreach ($rows as $row){
//don't include empty lines
if(!empty( $row )){
$data[] = explode('|', $row);
}
}
echo '<pre>';
var_export( $data );
Outputs:
array (
0 =>
array (
0 => 'Name',
1 => 'Code',
2 => 'Email',
3 => 'Designation',
4 => 'Number',
5 => 'Salary',
6 => 'Age',
),
1 =>
array (
0 => 'syed',
1 => '101',
2 => 'syed#gmail.com',
3 => 'trainee',
4 => '7222877798',
5 => '6000',
6 => '21',
),
2 =>
array (
0 => 'hari',
1 => '102',
2 => 'hari#gmail.com',
3 => 'trainee',
4 => '9554512582',
5 => '6000',
6 => '23',
),
);
However that said, there is a lot going on in your example, as for reading the file in. If it's not to large the best bet would be to use file_get_contents() that will read the whole file in one go. Otherwise in this part
$handle = fopen($file,"r"); // Open the file and read
while($strBookData = fgets($handle, 4096)) { // To get Array from
$strDatas[] = $strBookData;
$strTableColumn = count($strBookData);
}
You would be better off just concatenating the text.
$strDatas = '';
$handle = fopen($file,"r"); // Open the file and read
while($strBookData = fgets($handle, 4096)) { // To get Array from
$strDatas .= $strBookData;
}
And then splitting like I did above.
I think that you should first explode using '\t' as delimiter to get the substrings separated by \t (Name|Code|Email|Designation|Number|Salary|Age)
and then explode each substring using '|' as delimiter.
I wish that can help you

PHP CSV to Array in a specific way

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 ) )

Categories