0

I want to create a new array, and set its keys equal to the values of another array.

Start:

$names = array("don","james","jennifer","paul");
$ages = array("don" => 25, "paul" => 32);

Finish:

$name_age_map = array(
 "don" => 25,
 "james" => null,
 "jennifer" => null,
 "paul" => 32,
);

How should this be done in PHP? This is the best I've got so far:

$name_age_map = array();
foreach ($names as $name) {
  $name_age_map[$name] = $name_map[$name]; 
}

Ideally I wouldn't even create a new array, I'd just give element in $names a value of the age.

3
  • I looked at array_combine() but that is based on array index # more than matching up keys between an array. Commented Oct 17, 2013 at 19:25
  • I would have done something like that too probably, nice answer to your own question. Post below and accept:) Commented Oct 17, 2013 at 19:28
  • The elements of $names are values, not keys, so you can't give them a new value. Commented Oct 17, 2013 at 19:32

7 Answers 7

4

Just for fun, you could do it like this:

$names = array("don","james","jennifer","paul");
$ages  = array("don" => 25, "paul" => 32);
$names = array_merge(array_fill_keys($names, null), $ages);

var_dump($names);

Yields:

array(4) {
  ["don"]=>
  int(25)
  ["james"]=>
  NULL
  ["jennifer"]=>
  NULL
  ["paul"]=>
  int(32)
}
Sign up to request clarification or add additional context in comments.

Comments

1
$name_map = array();
foreach ($names as $name) {
  $name_map[$name] = isset($ages[$name])?$ages[$name]:null; 
}

Comments

0
array_merge(
   array_combine(
       $names,
       array_fill(0,count($names),NULL)
   ),
   $ages);

Comments

0
$name_age_map = array();

foreach ($names as $name){
    // this can also be replaced with
    // if (array_key_exists($name, $ages)){
    if (in_array($name, array_keys($ages))){
        $name_age_map[$name] = $ages[$name];
    }
    else {
        $name_age_map[$name] = null;
    }
}

2 Comments

array_key_exists is probably better than in_array().
you are right.Thanks for the tip. I will keep my current answer for reference since there are other answers that make use of array_key_exists function.
0

To manipulate the original array you need to flip it and then add the associated ages.

Try this:

$names = array_flip($names);
foreach($names as $key => $value)
{
    $names[$key] = (array_key_exists($key,$ages)) ? $ages[$key] : null;
}

Comments

0

array_key_exists() can help you when comparing keys in two array. Apply a loop and assign values where matches are found or null otherwise. This should work out for you.

$names = array("don","james","jennifer","paul");
$ages = array("don" => 25, "paul" => 32);

$merged = array();
foreach($names as $n) {
    if(array_key_exists($n, $ages)) {
        $merged[$n] = $ages[$n];
    } else {
        $merged[$n] = null;
    }
}

var_dump($merged);

//Produces

array(4) {
  ["don"]=>
  int(25)
  ["james"]=>
  NULL
  ["jennifer"]=>
  NULL
  ["paul"]=>
  int(32)
}

Comments

0

The problem is the values in $names are just that - values. To make them 'equal' an age, you need them to be keys. Because PHP doesn't support passing keys by reference, that means creating a new array:

$name_age_map = array();
foreach($names as $name) {
    if(isset($ages[$name])) {
        $name_age_map[$name] = $ages[$name];
    }
    else {
        $name_age_map[] = $name;
    }
}

Or if you always want names to be keys (which probably makes more sense):

$name_age_map = array();
foreach($names as $name) {
    $name_age_map[$name] =
            isset($ages[$name]) ? $ages[$name] : null;
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.