# in_array() and multidimensional array

Viewed   760 times

I use `in_array()` to check whether a value exists in an array like below,

``````\$a = array("Mac", "NT", "Irix", "Linux");
if (in_array("Irix", \$a))
{
echo "Got Irix";
}

//print_r(\$a);
``````

but what about an multidimensional array (below) - how can I check that value whether it exists in the multi-array?

``````\$b = array(array("Mac", "NT"), array("Irix", "Linux"));

print_r(\$b);
``````

or I shouldn't be using `in_array()` when comes to the multidimensional array?

4

`in_array()` does not work on multidimensional arrays. You could write a recursive function to do that for you:

``````function in_array_r(\$needle, \$haystack, \$strict = false) {
foreach (\$haystack as \$item) {
if ((\$strict ? \$item === \$needle : \$item == \$needle) || (is_array(\$item) && in_array_r(\$needle, \$item, \$strict))) {
return true;
}
}

return false;
}
``````

Usage:

``````\$b = array(array("Mac", "NT"), array("Irix", "Linux"));
``````
Monday, September 12, 2022

4

You need to iterate over your results, adding a new entry to the output when you encounter a new team, or updating the points value when you find the same team again. This is most easily done by initially indexing the output by the team name, and then using `array_values` to re-index the array numerically:

``````\$teams = array();
foreach (\$results as \$result) {
\$team = \$result['team'];
if (!isset(\$teams[\$team])) {
\$teams[\$team] = array('team' => \$team, 'points' => \$result['punti']);
}
else {
\$teams[\$team]['points'] += \$result['punti'];
}
}
\$teams = array_values(\$teams);
print_r(\$teams);
``````

``````Array
(
 => Array
(
[team] => Red Bull Racing
[points] => 418
)
 => Array
(
[team] => Scuderia Ferrari
[points] => 353
)
 => Array
(
[team] => Mercedes-AMG
[points] => 516
)
 => Array
(
[team] => Racing Point F1
[points] => 147
)
 => Array
(
[team] => Haas F1
[points] => 127
)
)
``````

Demo on 3v4l.org

Friday, August 12, 2022

2

Arrays (both one and multidimensional) in c reside in continuous memory blocks. This means that when you define `char a`, the array is laid out in memory like this (forgive my terrible ascii art skills):

``````| a | a | a |
``````

For a two-dimensional array `char a`, the layout is like this:

``````| a | a | a | a | a | a |
^
+--- first row ends here
``````

Therefore, when you index into a two-dimensional array `a[i][j]`, the compiler generates code equivalent to this:

``````*(a + i*3 + j)
``````

Which can be read as "skip i rows and take cell j in that row". To accomplish this, the compiler must know the length of the row (which is the second dimension). This means that the second dimension is a part of the type definition!

As such when you want pass a 2d array into a function, you must specify the needed dimension for the type definition.

Thursday, December 1, 2022

3
``````echo "Some string: {\$ARRAY['first']}";
``````

Complex (curly) syntax

This isn't called complex because the syntax is complex, but because it allows for the use of complex expressions.

Any scalar variable, array element or object property with a string representation can be included via this syntax. Simply write the expression the same way as it would appear outside the string, and then wrap it in { and }. Since { can not be escaped, this syntax will only be recognised when the \$ immediately follows the {. Use {\$ to get a literal {\$. Some examples to make it clear:

Wednesday, December 14, 2022

3

You can do it like this, do the calculation from the innermost of the array. Check the demo.

``````<?php
function f(&\$array)
{
foreach(\$array as \$k => &\$v)
{
if(is_array(\$v))
{
if(count(\$v) == count(\$v, 1))
{
unset(\$array[\$k]);
if(\$k == 'sum')
{
\$v =  array_sum(\$v);
\$array[] = \$v;

}elseif(\$k == 'multiply'){
\$v = array_product(\$v);
\$array[] = \$v;
}else{

foreach(\$v as \$vv)
\$array[] = \$vv;
}
}else
f(\$v);
}
}
}

while(count(\$array) != count(\$array, 1))
{
f(\$array);
}

print_r(\$array);
``````

Note：

traverse array from outer to inner
traverse array from inner to outer

Monday, November 14, 2022