multidimensional array search PHP reading from file - php

Hi In another post I learned how to read data from a text file into an array. After the script reads the text file here is the resulting array of data.
What I'm trying to do is simply return the 'key' or record number where a search string appears i.e. if I pass the parameter 'muscle3' it should return '3' because it is the third 'row' in the table
Then I can easily extract the other columns with $arrayTable[$keyVal][2] and $arrayTable[$keyVal][3]
As you can see the pageName which is the search field is stored in $arrayTable[$keyVal][2]
By getting the $keyValue from a search, i can then get the other pages.
i.e. mygreatwebsite.com/?page=muscle3
it then fetches the data from the array and it
But when I run the script below it gives the following error message
"Warning: Invalid argument supplied for foreach()"
$page=$_REQUEST['page'];
$keyVal = searchForId($page,$arrayTable); // this is the value I want returned
function searchForId($id, $array) {
foreach ($array as $key => $val) {
print_r ($val); print "<br><br>";
if ($val === $id) {
return $key;
}
}
return null;
here is the output from the above script
Array ( [0] => muscle1 [1] => arrayField [2] => description )
Array ( [0] => muscle2 [1] => arrayField2 [2] => description )
Array ( [0] => muscle3 [1] => arrayField3 [2] => description )
Can someone help me figure this one out? Thanks!
Someone asked how the array table is being defined: here it is
$i=0;
if (($handle = fopen($inputFile, "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$arrayTable[$i] = $data; $i++;
}
fclose($handle);
}
input file is a CSV file with the first row containing column headings and each subsequent row containing data
the first column is called 'pageName'
What I'm seeking to do is 'search' for the 'pageName' and just return which record.
i.e. Muscle 1 is in record #1 muscle3 is is record #3
its a simple example - the CSV file is much more complex that this.

Related

Pipe Delimited CSV File to HTML (But Values have Commas)

I am in the process of turning this CSV File of quotes to a HTML Table. The CSV Table is formatted as such:
The old world is dying, and a new world struggles to be born; now is the time of monsters.|Antonio Gramsci|1891-1937
The unexamined life is not worth living.|Socrates|c.469-399 B.C.
When converting it to an array by
<?php
$file = fopen("quotes.csv", "r");
$data = fgetcsv($file, 1000, "|");
$arr = [];
while (($data = fgetcsv($file, 1000, "|")) !== false) {
$arr[] = $data;
}
echo "<pre>";print_r($arr)
?>
1st Row gives me
[0] => Array
(
[0] => The old world is dying, and a new world struggles to be born; now is the time of monsters.|Antonio Gramsci|1891-1937|
Whereas 2nd row Correctly Gives me this output
[1] => Array
(
[0] => The unexamined life is not worth living.
[1] => Socrates
[2] => c.469-399 B.C.
)
How can I make the first row give me the output of the 2nd row? I know it has something to do with that comma in the first column but how do I work around that?

Loop not working with assosiative array Php

Can i make multidimensionalarrry to assosiative array, Right now i am getting following result
Array
(
[0] => Array
(
[id] => 1
[minimum_marks] => 55
[maximum_marks] => 65
)
[1] => Array
(
[id] => 2
[minimum_marks] => 44
[maximum_marks] => 70
}
)
I just want to put all values in single, i want result like following array
Array
(
[id] => 1
[minimum_marks] => 55
[maximum_marks] => 65
)
Array
(
[id] => 2
[minimum_marks] => 44
[maximum_marks] => 70
)
Here is my code,My code not showing only one record with loop (code should showing all minimum_marks and maximum_marks), where i am wrong ?
$result = $query->result_array();
$simpleArray = [];
foreach ($result as $skuArray) {
$simpleArray['minimum_marks'] = $skuArray['minimum_marks'];
$simpleArray['maximum_marks'] = $skuArray['maximum_marks'];
}
print_R($simpleArray);
I don't know why are you expecting this output. But my suggestion, if you want it really?
$simpleArray = [];
foreach ($result as $skuArray) {
$simpleArray['minimum_marks'] = $skuArray['minimum_marks'];
$simpleArray['maximum_marks'] = $skuArray['maximum_marks'];
print_R($simpleArray);
}
Print the value inside loop, so it wont push and it wont create multiple array. every time, it will overwrite. But please be sure, finally you get last array value only on the simpleArray. Hope you understood!
Let me explain with example. If you want to display the marks in table, I will suggest you to return directly like below instead of creating variable and retrieving it again.
echo '<table>
<tr><th>Min Marks</th><th>Max Marks</th></tr>';
foreach ($result as $skuArray) {
$minMarks = $skuArray['minimum_marks'];
$maxMarks = $skuArray['maximum_marks'];
echo '<tr><td>'.$minMarks.'</td><td>'.$minMarks.'</td></tr>';
}
echo '</table>';
I don't really understand what you want.
If you want to get your array in two different variables you can try this:
Use dynamic variables, the name of the variable is dynamically generated in your loop.
foreach($result as $key => $_array){
//$key is your inder of you multidimensional
$name_variable = '_array_number_'.$key; //Name of the variable
$$name_variable = $_array; //Instanciate dynamic variable
}
//You got now this two array
print_r($_array_number_0);
print_r($_array_number_1);
But please be more precise next time with what you expect and why you need this.
By the way, what happened to your code is that in the first loop you instanciate 'minimum_marks' and 'maximum_marks' in $_simple_array.
But in your second loop you overwrite the value of 'minimum_marks' and 'maximum_marks'.

Import CSV file into array

Thank you for the response. I will give it a try and update my question, I have my own code but it is a bit messy to show all. My problem is that I do not get the indexes right.
I use:
$products = array();
$lines = file('data_stock.csv', FILE_IGNORE_NEW_LINES);
foreach ($lines as $key => $value)
{
$products[$key] = str_getcsv($value);
}
And I manage to read the data, but this will give me an error:
if ((int)$products[$_sku] > 0 && isset($products[$_sku])) {
Error: Notice: Undefined index: test-product-1 in....
The 'test-product-1' is from the sku column in the csv file
Output from
echo '<pre>';
print_r($products);
echo '</pre>';
gives:
Array
(
[0] => Array
(
[0] => sku
[1] => qty
)
[1] => Array
(
[0] => test-product-1
[1] => 3
)
[2] => Array
(
[0] => test-product-2
[1] => 6
)
[3] => Array
(
[0] => test-product-3
[1] => 30
)
)
I am trying to use a csv file to be imported into the array to replace
$products = [
'test-product-1' => 3,
'test-product-2' => 6,
'test-product-3' => 30
];
But I can not produce the same array when I import from the CSV file, which will cause problems. Examples for CSV to array: http://php.net/manual/en/function.str-getcsv.php
CSV file:
sku,qty
test-product-1,3
test-product-2,6
test-product-3,30
Next step is to extend the script to handle prices. I need to be able to pick up these variables from the CSV file too. And use them inside the for loop.
sku,qty,price,special_price
test-product-1,3,100,50
test-product-2,6,99,
test-product-3,30,500,300
I think the problem is that when you store the row, your storing it indexed by the row number ($key will be the line number in the file). Instead I think you want to index it by the first column of the CSV file. So extract the data first (using str_getcsv() as you do already) and index by the first column ([0])...
$products = array();
$lines = file('data_stock.csv', FILE_IGNORE_NEW_LINES);
foreach ($lines as $value)
{
$data = str_getcsv($value);
$products[$data[0]] = $data;
}
If you want to add the first row as a header and use it to key the data...
$products = array();
$lines = file('data_stock.csv', FILE_IGNORE_NEW_LINES);
$headers = str_getcsv(array_shift($lines));
$products = array();
foreach ( $lines as $value ) {
$data = str_getcsv($value);
$products[$data[0]] = array_combine($headers, $data);
}
The removes the first row of the array using array_shift() and then uses this row in the array_combine() as the keys for each row. With your test data, you would get something like...
Array
(
[test-product-1] => Array
(
[sku] => test-product-1
[qty] => 3
[price] => 100
[special_price] => 50
)
I used following code in my project and its working fine for me.
I used csv_reader PHP library for it.
You have to put this library in your library folder and import it into file where you want to read your csv.
include_once('../csv_reader.php');
$read = new CSV_Reader;
$read->strFilePath = "file_name_with_path";
$read->strOutPutMode = 0; // 1 will show as HTML 0 will return an array
$read->setDefaultConfiguration();
$read->readTheCsv();
$dataArr = array();
$dataArr = $read->arrOutPut;
In $dataArr, i will get the result,

Escaping a comma when uploading a .csv to a database with PHP

I'm trying to do a simple PHP function to put a .csv file into a database. The problem is that the files are delimited with a semicolon and for some reason when a cell contains a comma it leaves out everything after it.
For example the .csv file
manufacturer;comment;year
toyota;good car, bad color;1997
comes out as the following when printed with the print_r() function
[0] => Array
(
[0] => manufacturer
[1] => comment
[2] => year
)
[1] => Array
(
[0] => toyota
[1] => good car
)
Edit
Here's the code I'm using.
//get the contents of the .csv file
$filepath = './files/csvfile.csv'
$fileopen = fopen($filepath,"r");
//create an empty array
$csv = array();
//go through the .csv file with fgetcsv()
while(($line = fgetcsv($fileopen,";")) !== FALSE)
{
$line = explode(";",$line[0]);
$csv[] = $line;
}
//print the result
echo "<pre>";
print_r($csv);
echo "</pre>";
fclose($fileopen);
Put the delimiter as the 3rd argument
http://php.net/manual/en/function.fgetcsv.php
while(($line = fgetcsv($fileopen, 0, ";")) !== FALSE)
I don't think you need that explode line either.

php csv to array

I am fairly new to php and got this from a stack overflow question and cant seem to get it to work for me.
<?php
if (($handle = fopen("fullbox.csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
echo "<pre>".print_r($data)." <br /></pre>";
}
fclose($handle);
}
echo $data[1];
?>
I need to set up a couple arrays for pricing using a large number of products(which I can pull from my csv file) Fullbox.csv consists of just 10 numbers with 2 decial places. I have just been trying to test this and this is the output that I get:
Array
(
[0] => 8.53
)
Array
(
[0] => 4.74
)
Array
(
[0] => 5.00
)
Array
(
[0] => 2.50
)
Array
(
[0] => 6.48
)
Array
(
[0] => 3.99
)
Array
(
[0] => 8.53
)
Array
(
[0] => 4.74
)
Array
(
[0] => 8.53
)
Array
(
[0] => 4.74
)
Why is the array setting all values in the [0} place holder of the array and also why is there a 1 in between each line. Thanks in advance.
Update If this is a ten item array this should then return the value of the 1 entry in the array but it doesn't. I essentially just need to store all of the prices so I can use them as variables later. I don't need them to be printed. Thanks again.
echo $data[1];
print_r does not return the formatted array by default; it outputs it and returns 1. Pass true as a second parameter.
echo "<pre>".print_r($data, true)." <br /></pre>";
All the values are in the 0 index of the array because arrays start at 0. There is nothing wrong there.
Try this:
$f = fopen(yourfile, "r");
$fs = filesize(yourfile);
$content = fread($f, $fs);
$lines = explode("\n", $content);
$result = array();
foreach($lines as $line) $result[] = explode(",", $line);
CSV as in Comma Seperated-Values is an array each line. So each line -even if it has only 1 value- is array.
Also you don't need to echo "print_r".
you also read the data from the CSV using the following function and sort using the usort() function.
http://www.pearlbells.co.uk/how-to-sort-a1a2-z9z10aa1aa2-az9az10-using-php/
Read data from the CSV
function readCSV() {
$csv = array_map('str_getcsv', file('data.csv'));
array_shift($csv); //remove headers
$csvData = splitandSort($csv);
createCSV($csvData);
}

Categories