2009-10-23 3 views
3

Представьте себе, что я хочу, чтобы создать массив из другого массива, как это:Лучший способ проверить, если массив ключей существует

$array = array('bla' => $array2['bla'], 
       'bla2' => $array2['bla2'], 
       'foo' => $array2['foo'], 
       'Alternative Bar' => $array['bar'], 
       'bar' => $array2['bar']); 

Что такое лучший способ проверить либо $ array2 имеет этот показатель я проходящее к другому массиву, без использования if для каждого индекса, который я хочу добавить.

Обратите внимание, что ключ от массива $ может отличаться от $ array2

+0

Что произойдет, если индекс не существует в '$ array2'? –

+0

Затем либо значение равно null, либо индекс в массиве $ не должен существовать. – LuRsT

ответ

2

Что я сделал, создавая шаблон массива с ключами, которые я хочу, например.

$template = array('key1', 'key2', 'key3'); 

Тогда, я бы объединить шаблон с другим массивом, если ключ отсутствовал во втором массиве, то значение ключа будет пустым, таким образом у меня нет проблемы предупреждения рассказывая мне о значениях смещения.

$template = array('key1', 'key2', 'key3'); 
$array = array_merge($template, $otherarray); 
1

если я понял правильно ...

$a = array('foo' => 1, 'bar' => 2, 'baz' => 3); 
$keys = array('foo', 'baz', 'quux'); 

$result = array_intersect_key($a, array_flip($keys)); 

это будет выбрать только существующие ключи от $ а

+0

Это не работает, если ключи не совпадают. – LuRsT

1

Возможна такая возможность:

$array = array(
     'bla' => (isset($array2['bla']) ? $array2['bla'] : ''), 
     'bla2' => (isset($array2['bla2']) ? $array2['bla2'] : ''), 
     'foo' => (isset($array2['foo']) ? $array2['foo'] : ''), 
     'xxx' => (isset($array2['yyy']) ? $array2['yyy'] : ''), 
     'bar' => (isset($array2['bar']) ? $array2['bar'] : '') 
    ); 

Если это произойдет более динамично, я бы предложил t, чтобы использовать array_intersect_key, например, опубликованный soulmerge. Но этот подход имел бы компромисс, который можно использовать только массивы с теми же ключами.

Поскольку ваши ключи в 2 массивах могут отличаться, вы можете создать что-то полудинамическое с помощью массива отображения, чтобы отображать ключи между массивами. У вас есть хотя бы список ключей, которые различаются в ваших массивах.

//key = key in $a, value = key in $b 
$map = array( 
    'fooBar' => 'bar'  
); 

$a = array(
    'fooBar' => 0, 
    'bla' => 0, 
    'xyz' => 0 
); 

$b = array(
    'bla' => 123, 
    'bar' => 321, 
    'xyz' => 'somevalue' 
); 

foreach($a as $k => $v) { 
    if(isset($map[$k]) && isset($b[$map[$k]])) { 
     $a[$k] = $b[$map[$k]]; 
    } elseif(isset($b[$k])){ 
     $a[$k] = $b[$k]; 
    } 
} 

Таким образом, вы должны определять только разные ключи в $ map.

+0

Так что что-нибудь более динамичное, чем это невозможно? : '( – LuRsT

+0

Из документов: 'isset() не возвращает TRUE для ключей массива, которые соответствуют значению NULL, в то время как array_key_exists() делает.' – Sebastian

0

Вы хотите извлечь определенные ключи из массива 1 и установить несуществующие ключи в пустую строку, если я правильно понял вас. Как это так:

# Added lots of newlines to improve readability 
$array2 = array_intersect_key(
    array(
     'bla' => '', 
     'bla2' => '', 
     'foo' => '', 
     # ... 
    ), 
    $array1 
); 
0

Возможно, это ...

$array = array(); 
foreach ($array2 as $key=>$val) 
{ 
    switch ($key) 
    { 
     case 'bar': 
      $array['Alternative bar'] = $val; 
      break; 
     default: 
      $array[$key] = $val; 
      break;    
    } 
} 

Для любой из «специальных» индексов массива, используйте пункт case, в противном случае просто скопировать значение.

Смежные вопросы