php foreach with multidimensional array

PhpArraysForeach

Php Problem Overview


I'm developing a php app that uses a database class to query mySQL.

the class is here: http://net.tutsplus.com/tutorials/php/real-world-oop-with-php-and-mysql/

I made some tweaks on the class to fit my needs, but there is a problem (maybe a stupid one)

When using select() it returns a multidimensional array like that for a table that has 3 cols (id, firstname, lastname):

Array
(
[0] => Array
(
[id] => 1
[firstname] => Firstname one
[lastname] => Lastname one
)

[1] => Array
    (
        [id] => 2
        [firstname] => Firstname two
        [lastname] => Lastname two
    )

[2] => Array
    (
        [id] => 3
        [firstname] => Firstname three
        [lastname] => Lastname three
    )

)

Now I want this array to be used as a mysql result (mysql_fetch_assoc).

I know that it may be used with foreach() but this is with simple arrays. so I think that I have to redeclare a new foreach() withing each foreach(), but I think this could slow down or cause some higher server load.

So how to apply foreach() with this multidimensional array the simplest way?

Thanks

Php Solutions


Solution 1 - Php

You can use foreach here just fine.

foreach ($rows as $row) {
    echo $row['id'];
    echo $row['firstname'];
    echo $row['lastname'];
}

I think you are used to accessing the data with numerical indices (such as $row[0]), but this is not necessary. We can use associative arrays to get the data we're after.

Solution 2 - Php

You can use array_walk_recursive:

array_walk_recursive($array, function ($item, $key) {
    echo "$key holds $item\n";
});

Solution 3 - Php

With arrays in php, the foreach loop is always a pretty solution.
In this case it could be for example:

foreach($my_array as $number => $number_array)
    {
    foreach($number_array as $data = > $user_data)
        {
            print "Array number: $number, contains $data with $user_data.  <br>";
        }
    }

Solution 4 - Php

This would have been a comment under Brad's answer, but I don't have a high enough reputation.

Recently I found that I needed the key of the multidimensional array too, i.e., it wasn't just an index for the array, in the foreach loop.

In order to achieve that, you could use something very similar to the accepted answer, but instead split the key and value as follows

foreach ($mda as $mdaKey => $mdaData) {
    echo $mdaKey . ": " . $mdaData["value"];
}

Hope that helps someone.

Solution 5 - Php

Holla/Hello, I got it! You can easily get the file name,tmp_name,file_size etc.So I will show you how to get file name with a line of code.

for ($i = 0 ; $i < count($files['name']); $i++) {
	echo $files['name'][$i].'<br/>';
}

It is tested on my PC.

Solution 6 - Php

To get detail out of each value in a multidimensional array is quite straightforward once you have your array in place. So this is the array:

$example_array = array(
array('1','John','Smith'),
array('2','Dave','Jones'),
array('3','Bob','Williams')
);

Then use a foreach loop and have the array ran through like this:

foreach ($example_array as $value) {
echo $value[0]; //this will echo 1 on first cycle, 2 on second etc....
echo $value[1]; //this will echo John on first cycle, Dave on second etc....
echo $value[2]; //this will echo Smith on first cycle, Jones on second etc....
}

You can echo whatever you like around it to, so to echo into a table:

echo "<table>"
    foreach ($example_array as $value) {
    echo "<tr><td>" . $value[0] . "</td>";
    echo "<td>" . $value[1] . "</td>";
    echo "<td>" . $value[2] . "</td></tr>";
    }
echo "</table>";

Should give you a table like this:

|1|John|Smith   |
|2|Dave|Jones   |
|3|Bob |Williams|

Solution 7 - Php

Example with mysql_fetch_assoc():

while ($row = mysql_fetch_assoc($result))
{
    /* ... your stuff ...*/
}

In your case with foreach, with the $result array you get from select():

foreach ($result as $row)
{
    /* ... your stuff ...*/
}

It's much like the same, with proper iteration.

Solution 8 - Php

Ideally a multidimensional array is usually an array of arrays so i figured declare an empty array, then create key and value pairs from the db result in a separate array, finally push each array created on iteration into the outer array. you can return the outer array in case this is a separate function call. Hope that helps

$response = array();    
foreach ($res as $result) {
        $elements = array("firstname" => $result[0], "subject_name" => $result[1]);
        array_push($response, $elements);
    }

Solution 9 - Php

I know this is quite an old answer. Here is a faster solution without using foreach:

Use array_column

print_r(array_column($array, 'firstname')); #returns the value associated with that key 'firstname'

Also you can check before executing the above operation

if(array_key_exists('firstname', $array)){
   print_r(array_column($array, 'firstname'));
}

Solution 10 - Php

Wouldn't a normal foreach basically yield the same result as a mysql_fetch_assoc in your case?

when using foreach on that array, you would get an array containing those three keys: 'id','firstname' and 'lastname'.

That should be the same as mysql_fetch_assoc would give (in a loop) for each row.

Solution 11 - Php

foreach ($parsed as $key=> $poke)
{
    $insert = mysql_query("insert into soal 
                          (pertanyaan, a, b, c, d, e, jawaban)
                          values
                          ('$poke[question]',
                          '$poke[options][A]',
                          '$poke[options][B]',
                          '$poke[options][C]',
                          '$poke[options][D]',
                          '$poke[options][E]',
                          '$poke[answer]')");
}

Solution 12 - Php

If you need to do string manipulation on array elements, e.g, then using callback function array_walk_recursive (or even array_walk) works well. Both come in handy when dynamically writing SQL statements.

In this usage, I have this array with each element needing an appended comma and newline.

$some_array = [];

data in $some_array
0: "Some string in an array"
1: "Another string in an array"

Per php.net

> If callback needs to be working with the actual values of the array, > specify the first parameter of callback as a reference. Then, any > changes made to those elements will be made in the original array > itself.

array_walk_recursive($some_array, function (&$value, $key) {
	$value .= ",\n";
});

Result:
"Some string in an array,\n"
"Another string in an array,\n"

Here's the same concept using array_walk to prepend the database table name to the field.

$fields = [];

data in $fields:
0: "FirstName"
1: "LastName"

$tbl = "Employees"

array_walk($fields, 'prefixOnArray', $tbl.".");

function prefixOnArray(&$value, $key, $prefix) { 
	$value = $prefix.$value; 
}

Result:
"Employees.FirstName"
"Employees.LastName"


I would be curious to know if performance is at issue over foreach, but for an array with a handful of elements, IMHO, it's hardly worth considering.

Solution 13 - Php

A mysql result set object is immediately iterable within a foreach(). This means that it is not necessary to call any kind of fetch*() function/method to access the row data in php. You can simply pass the result set object as the input value of the foreach().

Also, from PHP7.1, "array destructuring" allows you to create individual values (if desirable) within the foreach() declaration.

Non-exhaustive list of examples that all produce the same output: (PHPize Sandbox)

foreach ($mysqli->query("SELECT id, firstname, lastname FROM your_table") as $row) {
    vprintf('%d: %s %s', $row);
}

foreach ($mysqli->query("SELECT * FROM your_table") as ['id' => $id, 'firstname' => $firstName, 'lastname' => $lastName]) {
    printf('%d: %s %s', $id, $firstName, $lastName);
}

*note that you do not need to list all columns while destructuring -- only what you intend to access


$result = $mysqli->query("SELECT * FROM your_table");
foreach ($result as $row) {
    echo "$row['id']: $row['firstname'] $row['lastname']";
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmedkView Question on Stackoverflow
Solution 1 - PhpBradView Answer on Stackoverflow
Solution 2 - PhpKarolisView Answer on Stackoverflow
Solution 3 - Phpnao_de_naonedView Answer on Stackoverflow
Solution 4 - Phparvy3View Answer on Stackoverflow
Solution 5 - PhpAsraful HaqueView Answer on Stackoverflow
Solution 6 - PhpRmj86View Answer on Stackoverflow
Solution 7 - PhpaorcsikView Answer on Stackoverflow
Solution 8 - PhpPolyView Answer on Stackoverflow
Solution 9 - PhpRotimiView Answer on Stackoverflow
Solution 10 - PhpYhnView Answer on Stackoverflow
Solution 11 - PhpendipView Answer on Stackoverflow
Solution 12 - PhpGregory BolognaView Answer on Stackoverflow
Solution 13 - PhpmickmackusaView Answer on Stackoverflow