Question

I want to rewrite this associative array and switch the level of the value of the key [unique_name] to the first level. Any ideas?

Array (
    [0] => Array (
        [value] => value1
        [name] => name1
        [unique_name] => unique1
    )
    [1] => Array (
        [value] => value2
        [name] => name2
        [unique_name] => unique2
    )
    [2] => Array (
        [value] => value3
        [name] => name3
        [unique_name] => unique3
    )
)

Desired output:

Array (
    [unique1] => Array (
        [value] => value1
        [name] => name1
    )
    [unique2] => Array (
        [value] => value2
        [name] => name2
    )
    [unique3] => Array (
        [value] => value3
        [name] => name3
    )
)

Cheers, Adnan

Was it helpful?

Solution

Try the following loop:

// create an array to hold the new schema
$uniques = array();

// loop over all the records
foreach ($records as $record) {
    $uniques[$record['unique_name']] = $record;

    // remove the unique_name entry from the new array
    unset($uniques[$record['unique_name']]['unique_name']);
}

You could just as easily do a hardcoded key-set within the loop, but this will have less portability if you add new indexes later on:

foreach ($records as $record) {
    $uniques[$record['unique_name']] = array(
        'name' => $record['name'],
        'value' => $record['value']
    );
}

OTHER TIPS

$result = array();

foreach ($array as $entry) {
    $result[$array['unique_name']] = array_diff_key($entry, array_flip(array('unique_name')));
}
foreach($array as $item){
    $newarray[$item['unique_name']] = array('name' => $item['name'], 'value' => $item['value']);
}

Just for fun, a version using a lambda function with a closure:

$input = Array (
    Array ("value" => "value1", "name" => "name1", "unique_name" => "unique1"),
    Array ("value" => "value2", "name" => "name2", "unique_name" => "unique2"),
    Array ("value" => "value3", "name" => "name3", "unique_name" => "unique3"));

function set_unique_key ($array, $key)
{
    return array_reduce (
        $array,
        function ($res, $elem) use ($key) { 
            $res[$elem[$key]] = array_diff_key ($elem, array ("$key"=>''));
            return $res;
            }, 
        array());
}

print_r (set_unique_key ($input, 'unique_name'));
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top