Iain Urquhart
Iain Urquhart

Reputation: 143

Process an array to always contain keys (and order) from values of another array

I have the following 'key' array: (Array 1)

Array
(
    [0] => first_name
    [1] => surname
    [2] => position
    [3] => age
)

This array should determine the keys and the order of keys/values which should exist in Array 2. So in a perfect world Array 2 would look like this:

Array
(
    [0] => Array
        (
            [first_name] => James
            [surname] => Johnstone
            [position] => Striker
            [age] => 42
        )

    [1] => Array
        (
            [first_name] => Al
            [surname] => MacLean
            [position] => Defender
            [age] => 22
        )

    ...

)

The problem I'm having is in the following example array. Sometimes:

a) the order of keys in Array 2 is not the same as Array 1
b) and some of the keys defined in Array 1 don't exist in Array 2 - like so:

Array
(
    [0] => Array
        (
            [position] => Defender
            [first_name] => James
            [surname] => McDonald

        )

    [1] => Array
        (
            [position] => Striker
            [first_name] => Ben
            [surname] => Lailey
        )

    ...
)

I'd like some assistance creating a PHP function which will take a 'badly formed' Array 2 such as the one directly above, and convert it to how it should be: Order as defined by Array 1, and add any missing keys to become 'correct' like so:

Array
(
    [0] => Array
        (
            [first_name] => James
            [surname] => McDonald
            [position] => Defender
            [age] => 

        )

    [1] => Array
        (

            [first_name] => Ben
            [surname] => Lailey
            [position] => Striker
            [age] =>
        )

    ...
)

The keys used in this example are arbitrary, there could be a new key added, removed or re-ordered in Array 1 and I need Array 2 to respect Array 1.

Thank you in advance.

Upvotes: 4

Views: 121

Answers (3)

user557846
user557846

Reputation:

$new=array();    
foreach ($array2 as $a2){
  foreach($array1 as $k1=>$a1){
  $new[][$k1]=$a2[$k1];
  } 
}

Upvotes: 0

Luke Dennis
Luke Dennis

Reputation: 14550

A simple implementation:

// Pass in an array of keys, and an array of arrays
function cleanArray($keys, $arrays)
{
    // Create an empty container for our final output
    $final = array();

    // Loop through array of arrays
    foreach($arrays as $a)
    {
        // Create empty value for current item
        $next = array();

        // Loop through keys, in order
        foreach($keys as $k)
        {
            // Assign next key and value if we have it, or a blank string if we don't
            $next[$k] = isset($a[k]) ? $a[k] : '';
        }

        // Add current item to output
        $final[] = $next;
    }

    // Return final values, each item now having its keys ordered and normalized
    return $final;
}

Upvotes: 1

d3m
d3m

Reputation: 475

try using array-key-exists function http://php.net/manual/en/function.array-key-exists.php

if not exists add an empty element with the missing key. (you don't care for the order in an associative array)

Upvotes: 1

Related Questions