I have this two arrays that are generated in two foreach loops and I want to set the first array as keys and the second one as values.
after I use this code
foreach ($difference AS $j) {
$fv = $cate->getFilterValueByFeatureID($j);
foreach ($fv AS $z) {
$array = array(
$j => $z
);
var_dump($array);
}
}
this is what I get
array(1) {
[6]=>
int(15)
}
array(1) {
[6]=>
int(20)
}
array(1) {
[8]=>
int(26)
}
array(1) {
[8]=>
int(27)
}
array(1) {
[8]=>
int(33)
}
and I want this result
array(1){
[6] => array(
[0] => 15
[1] => 20
)
array(1){
[8] => array(
[0] => 26
[1] => 27
[2] => 33
)
Like this (untested)
$result = [];
foreach ($difference AS $j) {
$fv = $cate->getFilterValueByFeatureID($j);
foreach ($fv AS $z) {
if(!isset($result[$j])) $result[$j] = [];
$result[$j][] = $z;
}
}
var_dump($result);
Related
This question already has answers here:
Transpose 2d array, join second level with commas, and join first level with pipes
(5 answers)
Closed 7 months ago.
I have the following array.
$a = array("Algebra", "Arithmetic");
$b = array("08/01/2020", "08/02/2019");
$c = array("08/01/2020", "08/02/2019");
print_r($a);
print_r($b);
print_r($b);
and the output is
Array(
[0] => Algebra
[1] => Arithmetic
)
Array(
[0] => 08/01/2020
[1] => 08/01/2019
)
Array(
[0] => 08/02/2020
[1] => 08/02/2019
)
And I want Array in the following structure.
Array(
[0] => Algebra,08/01/2020,08/02/2020
[1] => Arithmetic,08/01/2019,08/02/2019
)
I have tried $results = array_merge_recursive($a, $b, $c); but its not giving desire output.
Thanks for help in advance.
A simple foreach loop will suffice
$a = array("Algebra", "Arithmetic");
$b = array("08/01/2020", "08/02/2019");
$c = array("08/01/2020", "08/02/2019");
foreach( $a as $i=>$v ) {
$new[] = sprintf( '%s,%s,%s', $v, $b[$i], $c[$i] );
}
Firstly, when you find yourself using sequentially-named variables it almost always means that they should actually be an array:
$a = array("Algebra", "Arithmetic");
$b = array("08/01/2020", "08/02/2019");
$c = array("08/01/2020", "08/02/2019");
$better_array = [$a, $b, $c];
var_dump($better_array);
Output:
array(3) {
[0]=>
array(2) {
[0]=>
string(7) "Algebra"
[1]=>
string(10) "Arithmetic"
}
[1]=>
array(2) {
[0]=>
string(10) "08/01/2020"
[1]=>
string(10) "08/02/2019"
}
[2]=>
array(2) {
[0]=>
string(10) "08/01/2020"
[1]=>
string(10) "08/02/2019"
}
}
Once they're in an proper array you can use array_column()
$out = [];
for($i=0, $c=count($better_array[0]); $i < $c; ++$i) {
$out[] = array_column($better_array, $i);
}
var_dump($out);
Output:
array(2) {
[0]=>
array(3) {
[0]=>
string(7) "Algebra"
[1]=>
string(10) "08/01/2020"
[2]=>
string(10) "08/01/2020"
}
[1]=>
array(3) {
[0]=>
string(10) "Arithmetic"
[1]=>
string(10) "08/02/2019"
[2]=>
string(10) "08/02/2019"
}
}
And if that comma-delimited string is what you actually want, then use implode():
$out = [];
for($i=0, $c=count($better_array[0]); $i < $c; ++$i) {
$out[] = implode(',', array_column($better_array, $i));
}
var_dump($out);
Output:
array(2) {
[0]=>
string(29) "Algebra,08/01/2020,08/01/2020"
[1]=>
string(32) "Arithmetic,08/02/2019,08/02/2019"
}
Lastly, you should avoid print_r() as it tends to produce misleading output. Eg: https://3v4l.org/ThSLb
You don't get anything built-in for this purpose. You need to build a custom function for this. You can try this-
<?php
$a = array("Algebra", "Arithmetic");
$b = array("08/01/2020", "08/01/2019");
$c = array("08/02/2020", "08/02/2019");
function mergeAssoc()
{
// You can get variable number of arguments|array by this.
$args = func_get_args();
$master = array();
foreach ($args as $arg)
{
foreach ($arg as $i => $v)
{
$master[$i][] = $v;
}
}
return $master;
}
$res = mergeAssoc($a, $b, $c);
print_r($res);
Note: It will return a multidimensional array. Not an array of comma-separated values.
Output:
Array
(
[0] => Array
(
[0] => Algebra
[1] => 08/01/2020
[2] => 08/02/2020
)
[1] => Array
(
[0] => Arithmetic
[1] => 08/01/2019
[2] => 08/02/2019
)
)
and if we use foreach then our desire output will be there with array separated by comma.
foreach ($res as $key => $value) {
$result[] = implode(',', $value);
}
and output of print_r($result); is
Array
(
[0] => Algebra,08/01/2020,08/02/2020
[1] => Arithmetic,08/01/2019,08/02/2019
)
Please help me to combine four arrays in one.
I have to compare main array keys and if the key of the secondaries arrays coincides, add them to the new array.
I tried to combine different php functions, but without the expected result and nothing relevant.
This is the main array.
[0] => Array
(
[1] => "Category1"
[2] => "Category2"
[3] => "Category3"
[4] => "Category4"
)
These are the secondaries arrays
[1] => Array
(
[1] "user_test_[1]" key 1 map to --> [1] Category1
[2] "user_test_[2]" key 2 map to --> [2] Category2
[3] "user_test_[3]" key 3 map to --> [3] Category3
[4] "user_test_[4]" key 4 map to --> [4] Category4
)
[2] => Array
(
2: "user_prod_[2]" key 2 map to --> [2] Category2
4: "user_prod_[4]" key 4 map to --> [4] Category4
)
[3] => Array
(
[3] "user_uat_[3]" key 3 map to --> [3] Category3
[4] "user_uat_[4]" key 4 map to --> [4] Category4
)
New array results in php format:
$array_result = array(
'Category1'=>array(
'user_test_[1]'
),
'Category2'=>array(
'user_test_[2]',
'user_prod_[2]'
),
'Category3'=>array(
'user_test_[3]',
'user_uat_[3]'
),
'Category4'=>array(
'user_test_[4]',
'user_prod_[4]',
'user_uat_[4]'
)
);
Main array in in php format:
$array_cat = array(1=>"Category1", 2=>"Category2", 3=>"Category3", 4=>"Category4");
These are the secondaries arrays in php fromat:
$array_usrtest = array(1=>"user_test_[1]", 2=>"user_test_[2]", 3=>"user_test_[3]", 4=>"user_test_[4]");
$array_usruat = array(3=>"user_uat_[3]", 4=>"user_uat_[4]");
$array_usrprod = array(2=>"user_prod_[2]", 4=>"user_prod_[4]");
Expected results
array{
["Category1"]=>array(1)
{
[0]=>"user_test_[1]"
}
["Category2"]=>array(2)
{
[0]=>"user_test_[2]"
[1]=>"user_prod_[2]"
}
["Category3"]=>array(3)
{
[0]=>"user_test_[3]"
[2]=>"user_uat_[3]"
}
["Category4"]=>array(3)
{
[0]=>"user_test_[4]"
[1]=>"user_prod_[4]"
[2]=>"user_uat_[4]"
}
}
Here is simple solution, which it's not very good, because it is solution for your specific values, but it is good start point and if you want, you can improve it:
<?php
$array_cat = array(1=>"Category1", 2=>"Category2", 3=>"Category3", 4=>"Category4");
$array_usrtest = array(1=>"user_test_[1]", 2=>"user_test_[2]", 3=>"user_test_[3]", 4=>"user_test_[4]");
$array_usruat = array(3=>"user_uat_[3]", 4=>"user_uat_[4]");
$array_usrprod = array(2=>"user_prod_[2]", 4=>"user_prod_[4]");
$result = [];
foreach ($array_cat as $k => $v) {
$result[$v] = []; // fill result array with categories
}
$values = array_merge($array_usrtest, $array_usruat, $array_usrprod); // merge arrays into one (all items)
foreach ($values as $k => $value) { // iterate over all values
preg_match('!\d+!', $value, $match); // get index in [index]
$result['Category' . $match[0]][] = $value; // append values to category
}
echo '<pre>';
var_dump($result);
Result:
array(4) {
["Category1"]=>
array(1) {
[0]=>
string(13) "user_test_[1]"
}
["Category2"]=>
array(2) {
[0]=>
string(13) "user_test_[2]"
[1]=>
string(13) "user_prod_[2]"
}
["Category3"]=>
array(2) {
[0]=>
string(13) "user_test_[3]"
[1]=>
string(12) "user_uat_[3]"
}
["Category4"]=>
array(3) {
[0]=>
string(13) "user_test_[4]"
[1]=>
string(12) "user_uat_[4]"
[2]=>
string(13) "user_prod_[4]"
}
}
I would say merge all array and then build the category array
$arrs = array_merge($array_usrtest, $array_usruat, $array_usrprod);
$categories = array_fill_keys($array_cat, []);
array_walk($arrs, function($item) use (& $categories){
preg_match('#(.*)\[(\d)\]#', $item, $matches);
$key = $matches[2];
$categories['Category' . $key][] = $item;
});
print_r($categories);
Based on yours answers:
<?php
$array_cat = array(1=>"Category1", 2=>"Category2", 3=>"Category3", 4=>"Category4");
$array_usrtest = array(1=>"user_test_[1]", 2=>"user_test_[2]", 3=>"user_test_[3]", 4=>"user_test_[4]");
$array_usruat = array(3=>"user_uat_[3]", 4=>"user_uat_[4]");
$array_usrprod = array(2=>"user_prod_[2]", 4=>"user_prod_[4]");
$values = array_merge($array_usrtest, $array_usruat, $array_usrprod);
$result = [];
foreach ($array_cat as $key => $cat) {
foreach ($values as $k => $value) { // iterate over all values
preg_match('!\d+!', $value, $match); // get index in [index]
if ($key == $match[0]) {
$result[$cat][] = $value; //append values to category
}
}
}
echo '<pre>';
var_dump($result);
?>
Result:
array(4) {
["Category1"]=>
array(1) {
[0]=>
string(13) "user_test_[1]"
}
["Category2"]=>
array(2) {
[0]=>
string(13) "user_test_[2]"
[1]=>
string(13) "user_prod_[2]"
}
["Category3"]=>
array(2) {
[0]=>
string(13) "user_test_[3]"
[1]=>
string(12) "user_uat_[3]"
}
["Category4"]=>
array(3) {
[0]=>
string(13) "user_test_[4]"
[1]=>
string(12) "user_uat_[4]"
[2]=>
string(13) "user_prod_[4]"
}
}
I have an array stored in a variable $data. The array has names in the first row and a value in the second row. The array is very big so I need a way to take the five highest values from it and the name from those value. For example I have this array:
[0]=>
array(1447) {
[1]=>
array(3) {
[0]=>
string(11) "Cris"
[2]=>
string(1) "11"
}
[2]=>
array(3) {
[0]=>
string(7) "Alan"
[2]=>
string(1) "28"
}
[3]=>
array(3) {
[0]=>
string(6) "Alex"
[2]=>
string(1) "50"
}
[4]=>
array(3) {
[0]=>
string(6) "Zone"
[1]=>
string(1) "22"
}
[5]=>
array(3) {
[0]=>
string(6) "Ana"
[2]=>
string(1) "1"
}
[6]=>
array(3) {
[0]=>
string(6) "Fisca"
[1]=>
string(1) "5"
}
In this case I should display: Alex 50, Alan 28, Zone 22, Cris 11 and Fisca 5. I tried to find a solution but I don't know how should I make a top of array values. Can you help me please? Thank you in advance.
First sort your array and then slice the top 5:
DEMO
usort($data, function ($a, $b) {
return $b[1] - $a[1];
}); //Sort your array
$resultant = array_slice($data,0,5); //Pick top 5
Note: If your index used for comparison differs, then change your return statement to:
return (isset($b[1])?$b[1]:$b[2]) - (isset($a[1])?$a[1]:$a[2]);
Example:
<?php
$data = [
['Cris', 11],
['Alan', 28],
['Alex', 50],
['Zone', 22],
['Ana', 1]
];
usort($data, function ($a, $b) {
return $b[1] - $a[1];
});
print_r(array_slice($data,0,5));
Result:
Array
(
[0] => Array
(
[0] => Alex
[1] => 50
)
[1] => Array
(
[0] => Alan
[1] => 28
)
[2] => Array
(
[0] => Zone
[1] => 22
)
[3] => Array
(
[0] => Cris
[1] => 11
)
[4] => Array
(
[0] => Ana
[1] => 1
)
)
DEMO
You can use this to get the 5 highest values of your array:
<?php
function compare($a, $b) {
if ($a[1] == $b[1]) {
return 0;
}
return ($a[1] > $b[1]) ? -1 : 1;
}
usort($theBigArray, "compare");
$fiveHighestValues = array_slice($theBigArray, 0, 5);
?>
($theBigArray being your array)
And then, you can loop through the $fiveHighestValues var to display the five elements as you want, e.g.:
<?php
foreach($fiveHighestValues as $value) {
echo $value[0] .' has the value '. $value[1];
// output: Alex has the value 50
}
?>
I would first sort the array like this
function mySort($a, $b) {
return $b[1] - $a[1];
}
usort($arr, 'mySort');
Then you can just pop the first 5 values - they are the highest.
You've written that 'The array has names in the first row and a value in the second row.', but I can see that for 'Zone' the index '1' is set not '2', so in your sorting function you might need to add some simple checking, maybe something like this:
function mySortWithCheck($a, $b) {
if (isset($b[1])) {
$valB = $b[1];
} else {
$valB = $b[2];
}
if (isset($a[1])) {
$valA = $a[1];
} else {
$valA = $a[2];
}
return $valB - $valA;
}
<?php
$data = array(
array("Cris", "11"),
array("Alan", "28"),
array("Alex","50"),
array("Zone","22"),
array("Ana","1")
);
var_dump($data);
function custom_array_sort($a, $b) {
return $b[1] - $a[1];
}
usort($data,'custom_array_sort');
$sorted = array_slice($data,0,5);
var_dump($sorted);
?>
How do I print this array?
<?php
$datos = array(
array('AZUAY', array('P', 'Q'))
);
//print array
foreach ($datos as $dato1) {
foreach ($dato1 as $v2) {
echo $v2;
foreach ($v2 as $v3)
echo $v3;
}
echo "<br>";
}
?>
You can use printf() or var_dump() as a simple pretty-printer:
print_r($datos);
var_dump($datos);
Output:
print_r()
Array ( [0] => Array ( [0] => AZUAY [1] => Array ( [0] => P [1] => Q ) ) )
var_dump()
array(1) { [0]=> array(2) { [0]=> string(5) "AZUAY" [1]=> array(2) { [0]=> string(1) "P" [1]=> string(1) "Q" } } }
Something like this should work:
$datos = array(
array('AZUAY', array('P', 'Q'))
);
function printWeirdArray($array)
{
foreach($array as $i)
{
if(is_array($i))
{
printWeirdArray($i);
}
else
{
print $i."-";
}
}
}
printWeirdArray($datos);
The above code outputs:
AZUAY-P-Q-
Good luck!!
i have array an with this result :
Array
(
[A] => Array
(
[0] => A
[1] => B
[2] => C
)
[B] => Array
(
[0] =>AA
[1] =>BB
[2] =>CC
)
[C] => Array
(
[0] =>AAA
[1] =>BBB
[2] =>CCC
)
)
i want to get like rows and print like with this result to each row:
A AA AAA
B BB BBB
C CC CCC
how to use foreach to print that result?
foreach ($result as $kk => $arr)
{
foreach($arr as $k=>$v)
{
if ( $k == 'A')
echo $arr[0];
if ( $k == 'B')
echo $arr[1];
if ( $k == 'B')
echo $arr[2]."<br />";
}
}
Create a new tmp variable for storing our new order.
$tmp = array();
How deep will the array go? In your example we go down 3 levels..
$depth = 3;
The array you want to sort
$result = array(
'a' => array( 'a', 'b', 'c' ),
'b' => array( 'aa', 'bb', 'cc' ),
'c' => array( 'aaa', 'bbb', 'ccc' ),
);
For each level in $result down to $depth.
for ($i=0; $i<$depth; $i++)
{
// Loop true our results and push them in to the right position in our $tmp array.
foreach ($result as $row)
{
$tmp[$i][] = $row[$i];
}
}
Output var_dump($tmp):
array(3) {
[0]=>
array(3) {
[0]=>
string(1) "a"
[1]=>
string(2) "aa"
[2]=>
string(3) "aaa"
}
[1]=>
array(3) {
[0]=>
string(1) "b"
[1]=>
string(2) "bb"
[2]=>
string(3) "bbb"
}
[2]=>
array(3) {
[0]=>
string(1) "c"
[1]=>
string(2) "cc"
[2]=>
string(3) "ccc"
}
}
And of course.. to print out your re-ordered array with foreach:
foreach($tmp as $row) {
echo "{$row[0]} {$row[1]} {$row[2]}";
}
will give you:
a aa aaa
b bb bbb
c cc ccc
If you denote your input as $hash, then $result will have the array in the form that you need:
$arr = array_values($hash);
$result = array();
$len = count($arr);
$lenNested = count($arr[0]);
for($i = 0; $i < $len; $i++){
for($j = 0; $j < $lenNested; $j++){
$result[$j][$i] = $arr[$i][$j];
}
}
This is just transposition of $hash. Now you can print out $result line by line.