I'm posting this topic because I wanted to know if it was possible to retrieve the keys of a multidimensional array in a sort method.
The structure of the table is as follows :
$array = Array();
$array['Key-1'] = Array('Element-1' => 'a', 'Element-2' => 'b', 'Element-3' => 'c', 'Element-4' => 'd');
$array['Key-2'] = Array('Element-1' => 'e', 'Element-2' => 'f', 'Element-3' => 'g', 'Element-4' => 'h');
$array['Key-3'] = Array('Element-1' => 'i', 'Element-2' => 'j', 'Element-3' => 'k', 'Element-4' => 'l');
$array['Key-4'] = Array('Element-1' => 'm', 'Element-2' => 'n', 'Element-3' => 'o', 'Element-4' => 'p');
For example, when I define a sort method, I can access the items Element-1, Element-2, Element-3 and/or Element-4, in the variables $a and $b. What i wanted to know is if i could also access the upper keys : Key-1, Key-2, Key-3 or Key-4.
function sortMethod($a, $b){
=> get here index key based on the item retrieved (Key-1, Key-2, ...)
}
usort($array, 'sortMethod');
Indeed, I need it because the sorting method must be based on these keys (Key-1, Key-2, ...) and also on the values (Element-1, Element-2, ...).
Like what we could do in a foreach loop when we specify :
foreach ($array as $key => $value) {}
Thanks for your help
Best regards
You cas use uksort() and a closure to access to 1. array keys and 2. array values :
Eg. :
<?php
$array = [
'Key-1' => ['Element-1' => 'a', 'Element-2' => 'b', 'Element-3' => 'c', 'Element-4' => 'd'],
'Key-2' => ['Element-1' => 'e', 'Element-2' => 'f', 'Element-3' => 'g', 'Element-4' => 'h'],
'Key-3' => ['Element-1' => 'i', 'Element-2' => 'j', 'Element-3' => 'k', 'Element-4' => 'l'],
'Key-4' => ['Element-1' => 'm', 'Element-2' => 'n', 'Element-3' => 'o', 'Element-4' => 'p'],
];
uksort($array, function ($key_a, $key_b) use ($array) {
echo "===================\r\n";
echo "First key : {$key_a}, first element : ";
print_r($array[$key_a]);
echo "Second key : {$key_b}, second element : ";
print_r($array[$key_b]);
// ...
});
Gives :
===================
First key : Key-1, first element : Array
(
[Element-1] => a
[Element-2] => b
[Element-3] => c
[Element-4] => d
)
Second key : Key-2, second element : Array
(
[Element-1] => e
[Element-2] => f
[Element-3] => g
[Element-4] => h
)
===================
First key : Key-2, first element : Array
(
[Element-1] => e
[Element-2] => f
[Element-3] => g
[Element-4] => h
)
Second key : Key-3, second element : Array
(
[Element-1] => i
[Element-2] => j
[Element-3] => k
[Element-4] => l
)
===================
First key : Key-3, first element : Array
(
[Element-1] => i
[Element-2] => j
[Element-3] => k
[Element-4] => l
)
Second key : Key-4, second element : Array
(
[Element-1] => m
[Element-2] => n
[Element-3] => o
[Element-4] => p
)
https://www.php.net/uksort
https://www.php.net/manual/functions.anonymous.php
Related
How to get an echo of the keys of a array, on a single line ?
[The] => s
[revelation] => b
[that] => z
[the] => d
[Star] => e
[Wars] => h
Result :
<p>The revelation that the Star Wars.</p>
It's pretty simple:
$myArray = [
'The' => 's',
'revelation' => 'b',
'that' => 'z',
'the' => 'd',
'Star' => 'e',
'Wars' => 'h',
];
echo implode(' ', array_keys($myArray));
This basically gets an array of the keys, then implodes them with spaces.
I show my example of diff between values in arrays, sometimes doesn't work corectly.
$fields = array(
'1x1' => 'k',
'1x2' => 'B',
'1x3' => 'c',
'2x1' => 'd',
'2x2' => 'x',
'2x3' => 'Y',
'3x1' => 'b',
'3x2' => 'e',
'3x3' => 'f'
);
print_r($fields);
$answer = array(
'a',
'b',
'c',
'd',
'x',
'y',
'z',
'e',
'f'
);
print_r($answer);
echo '<hr />DIFF:<br />';
print_r(array_diff($fields, $answer));
?>
Results is:
(
[1x1] => k
[1x2] => B
[2x3] => Y
)
But should be:
(
[1x1] => k
[1x2] => B
[2x3] => Y
[3x1] => b
)
Why for PHP b is equal with z?
How to repair this?
This is working correct. According to array_diff() documentation:
array array_diff ( array $array1 , array $array2 [, array $... ] )
Compares array1 against one or more other arrays and returns the
values in array1 that are not present in any of the other arrays.
Another important info from documentation:
Two elements are considered equal if and only if (string) $elem1 ===
(string) $elem2. In words: when the string representation is the same.
So in $answers array there are no k, B, Y elements of $fields array.
The method isn't wrong, compare the 2 lists, they both contain b
see you put 'b' into both the $answer and the $fields array .
so that's why it gives u such output .
Given (A,B,C,D)
What is an algorithm that can reduce it to unique non duplicated sets of size n.
For example if n is 3.
[A,B,C]
[A,C,D]
[A,B,D]
[B,C,D]
As you'll notice A,A,A cannot be valid neither can A,A,B and [A,C,D] = [C,A,D] = [A,C,D] = [D,C,A] = etc..
is there a way to not generate the powerset and reduce it because a powerset of 7 elements is n^7, which quickly gets exhaustive.
Take a look at Math_Combinatorics.
<?php
require 'Combinatorics.php';
$combinatorics = new Math_Combinatorics;
$result = $combinatorics->combinations( ['A','B','C','D'], 3 );
var_export($result);
prints
array (
0 =>
array (
0 => 'A',
1 => 'B',
2 => 'C',
),
1 =>
array (
0 => 'A',
1 => 'B',
3 => 'D',
),
2 =>
array (
0 => 'A',
2 => 'C',
3 => 'D',
),
3 =>
array (
1 => 'B',
2 => 'C',
3 => 'D',
),
)
It also has a permutations method (i.e. [A,B,C]!=[A,C,B] and therefore both are in the result set)
To save on typing out the key name for every single array, I want to be able to build lists like..
$lists = array (
0 => array ('A', 'B', 'C', 'D', 'E');
1 => array ('A', 'B', 'C', 'D', 'E');
2 => array ('A', 'B', 'C', 'D', 'E');
)
.. and then assign the same key names to all them (either before or after)..
Key1, Key2, Key3, Key4, Key5
.. so when they're called, I can do something like..
foreach($lists as $list) {
showList($list);
}
.. and then within the showList() function, I can call the 5 keys by the key name.
The function I have set no problem, but it's assigning the key names that I'm not sure how to do. Sorry if my terminology isn't accurate, but hopefully I explained it well enough.
array_combine will make an associative array from an array of keys and an array of values.
$keys = array('Key1', 'Key2', 'Key3', 'Key4', 'Key5');
foreach ($lists as $list) {
showList(array_combine($keys, $list));
}
If you want to modify $lists permanently, you can do:
foreach ($lists as &$list) {
$list = array_combine($keys, $list);
}
The reference variable &$list makes this replace the elements in place.
Try this :
<?php
$keys = array('Key1', 'Key2', 'Key3', 'Key4', 'Key5');
$lists = array (
array ('A', 'B', 'C', 'D', 'E'),
array ('A', 'B', 'C', 'D', 'E'),
array ('A', 'B', 'C', 'D', 'E')
);
function showList($list){
global $keys;
return array_combine($keys, $list);
}
$output = array_map("showList", $lists);
echo "<pre>";
print_r($output);
?>
Result:
Array
(
[0] => Array
(
[Key1] => A
[Key2] => B
[Key3] => C
[Key4] => D
[Key5] => E
)
[1] => Array
(
[Key1] => A
[Key2] => B
[Key3] => C
[Key4] => D
[Key5] => E
)
[2] => Array
(
[Key1] => A
[Key2] => B
[Key3] => C
[Key4] => D
[Key5] => E
)
)
My Question is, i got an array with mix keys (i mean numeric and string);
This is my code sample,
Array
(
[_id] => 1, [month] => 052014, [studId] => STU140528155358,
[1] => 'p', [2] => , [3] => ,[4] => ,[12] => 'a'
)
Now I try to
print_r($array[3]);
It gives error undefined offset 3
SAMPLE:-
Run This:
$a = array("name"=>"Nishchit",[1]=>"Dhanani");
print_r($a[1]);
This will work-
$a = array("name"=>"Nishchit",1=>"Dhanani");
print_r($a[1]);
You have done a mistake of putting [1] instead of just 1 as key.
And if you want a nested array, you can do this -
$a = array("name"=>"Nishchit",[1=>"Dhanani"]);
print_r($a[0]);
print_r($a[0][1]);
$a = array(
'_id' => 1,
'month' => 052014,
'studId' => STU140528155358,
1 => 'p',
12 => 'a'
);
echo "<pre>";
print_r($a[1]);
Output -
p
$b = array(
'_id' => 1,
'month' => 052014,
'studId' => STU140528155358,
1 => 'p',
2 => '',
12 => 'a'
);
echo "<pre>";
print_r($b[12]);
Output -
a