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.
array_merge(
array_combine(
$names,
array_fill(0,count($names),NULL)
),
$ages);
$name_map = array();
foreach ($names as $name) {
$name_map[$name] = isset($ages[$name])?$ages[$name]:null;
}
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;
}
$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;
}
}
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;
}
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)
}
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)
}