Hi All -
How do I handle using multiple foreach loops? Currently I have:
foreach($th as $t_file)
foreach ($orig as $file)
{
...
}
But this doesn’t seem correct to me…
Thanks
Hi All -
How do I handle using multiple foreach loops? Currently I have:
foreach($th as $t_file)
foreach ($orig as $file)
{
...
}
But this doesn’t seem correct to me…
Thanks
You just need some more brackets:
foreach ($array as $value) {
foreach ($array1 as $value1) {
// do something with $value and $value1
}
}
Thanks very much –
I’m using it as an insert into a database:
foreach($value as $value1) {
foreach ($info as $info2) {
$sql = "INSERT INTO table_name (column1,column2) VALUES ('$value1','$info2')";
if (!mysqli_query($link, $sql))
{
$output = 'Error adding submitted path.';
include 'output.html.php';
exit();
}
}
}
However, it gives 150 rows when only it should give 20 - since it repeats the entries when inserting into the database many times over.
What am I doing wrong here - any help is appreciated.
Thanks
Can you post the code that is above (where your getting the contents of the $value and $info arrays from)?
Here is the code for ‘value1’. It is similar for ‘info’.
if ($handle = opendir('../thumbs/')) {
while (false !== ($value1 = readdir($handle))) {
if (($value1 != '.') && ($value1 != '..') && ($value1 != basename($_SERVER['PHP_SELF']))) {
//store filename
$value[] = $value1;
}
}
closedir($handle);
}
When I echo this out it gives me exactly what it should. And when I echo it into the database as one foreach statement, it works fine.
However, when I try to combine my foreach statements, it creates problems.
As SpacePhoenix said, having a look at some more code could come in handy. Anyway, if I understood it correctly, maybe you want to add a series of couples in the database, meaning a value from $value and a value from $info. Is this correct? If so, your code should be:
for (i=0; i<count($value); i++) {
$sql = "INSERT INTO table_name (column1,column2) VALUES ('$value[i]','$info[i]')";
}
You get a lot of rows because what you wrote means that for every element in the first array you will insert a row in the database with every element of the second array -> if you have 10 elements in the first array and 10 elements in the second one, every element in the first array is inserted 10 times -> 100 rows.
I wouldnt even do that. Take a look at “Inserting Multiple Records Into a Table” in the MySQL manual, and you should be able to do 1 query to insert all your records, which would be much more efficient.
INSERT INTO example
(example_id, name, value, other_value)
VALUES
(100, 'Name 1', 'Value 1', 'Other 1'),
(101, 'Name 2', 'Value 2', 'Other 2'),
(102, 'Name 3', 'Value 3', 'Other 3'),
(103, 'Name 4', 'Value 4', 'Other 4');
How are $value and $info related? If it’s a 1-to-1, you dont want a nested foreach at all. If it’s 1-to-all, you do.
I’ll take a look at that -
Yes, it is a one-to-one relation.
The data for both is coming from a readdir and then a converted thumbnail.
Cheers
Okay - a 1-to-1 you should NOT need a nested foreach. Try something like this.
foreach($info AS $key => $info1) {
$buildstring[] = "('".$info1."','".$value[$key]."')";
}
mysql_query("INSERT INTO table_name (column1,column2) VALUES " .implode(' , ',$buildstring).";");
This code assumes that $info[0] corresponds to $value[0], etc etc.
Unfortuantely, the above code doesn’t work - it generates 76 rows when there should only be 12.
I know there must be an answer here somewhere. Here is the simple code to insert with only one array [works great]:
$th[] = $t_file;
foreach($th as $t_file) {
$sql = "INSERT INTO table_name (col_1) VALUES ('$t_file')";
}
Now, suppose I want to add another array [I know this isn’t correct]:
$th[] = $t_file;
$orig[] = $file;
foreach($th as $t_file) && ($orig as $file) {
$sql = "INSERT INTO table_name (col_1,col_2) VALUES ('$t_file', '$file')";
}
How do I combine these arrays for an insert?
Okay, if you’re insistant on doing it one query at a time…
foreach($th AS $index => $t_file) {
$sql = "INSERT INTO table_name (col_1,col_2) VALUES ('$t_file', '".$orig[$index]."')";
//run query here.
}
again, this is assuming that $th[0] corresponds to $orig[0], etc.