Reputation: 2688
How can I specify what order items should appear in an array?
I am given a 3 level array, somewhat like the following:
Array
(
[AK] => Array
(
[ACO] => Array
(
[FFS] => Array
(
[Medicaid] => -
[CHIP] => -
)
)
[ZCO] => Array
(
[FFS] => Array
(
[Medicaid] => -
[CHIP] => -
)
)
[Other] => Array
(
[FFS] => Array
(
[Medicaid] => -
[CHIP] => -
)
)
)
[AR] => Array
(
[Other] => Array
(
[Other] => Array
(
[Medicaid] => -
[CHIP] => -
)
)
[ACO] => Array
(
[FFS] => Array
(
[Medicaid] => -
[CHIP] => -
)
)
[ZCO] => Array
(
[FFS] => Array
(
[Medicaid] => -
[CHIP] => -
)
)
)
)
How can I make them sort list the first element [AK]
, by the second level named element(I need them both to be [ACO], [ZCO], [Other]
)?
Upvotes: 0
Views: 70
Reputation: 2194
// CREATE THE TEST DATA
$arr = Array
( 'AK' => Array
( 'ACO' => Array( 'FFS' => Array( 'Medicaid' => '-', 'CHIP' => '-' ) )
, 'ZCO' => Array( 'FFS' => Array( 'Medicaid' => '-', 'CHIP' => '-' ) )
, 'Other' => Array( 'FFS' => Array( 'Medicaid' => '-', 'CHIP' => '-' ) )
)
, 'AR' => Array
( 'Other' => Array( 'FFS' => Array( 'Medicaid' => '-', 'CHIP' => '-' ) )
, 'ACO' => Array( 'FFS' => Array( 'Medicaid' => '-', 'CHIP' => '-' ) )
, 'ZCO' => Array( 'FFS' => Array( 'Medicaid' => '-', 'CHIP' => '-' ) )
)
)
;
// ACTIVATE THIS TO ANSWER THE QUESTION: DOES IT LOOK RIGHT?
// print_r($arr);
// GET THE ORDER FOR THE [AK] ARRAY
$pat = array_keys($arr['AK']);
// ITERATE OVER THE ARRAY TO PRODUCE THE ORDERED OUTPUT
$out = array();
foreach($arr as $key => $inner)
{
// SKIP THE SIGNAL ARRAY
if ($key == 'AK')
{
$out[$key] = $inner;
continue;
}
// REORDER THE OTHER ARRAYS
else
{
$temp = array();
foreach ($pat as $inner_key)
{
$temp[$inner_key] = $inner[$inner_key];
}
$out[$key] = $temp;
}
}
// SHOW THE WORK PRODUCT
print_r($out);
Upvotes: 0
Reputation: 14982
Dictionary is datastructure without order.
But php by default iterate items in order which elements been pasted.
So, you can simple recreate array in necessary order
Or write custom sort function using php usort method.
small example:
function compare($a, $b)
{
$order = array('ACO', 'ZCO', 'Other');
$ai = array_search($a, $order);
$bi = array_search($b, $order);
return $ai<$bi ? -1 : $ai>$bi;
}
$a = array('ZCO'=>1, 'Other'=>1, 'ACO'=>1);
uksort($a, "compare");
print_r($a);
Upvotes: 1