Kevin
Kevin

Reputation: 2688

PHP Array How to specify what order items should be

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

Answers (2)

Ray Paseur
Ray Paseur

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

vp_arth
vp_arth

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

Related Questions