Лучший способ проверить, существует ли ключ массива - PullRequest
3 голосов
/ 23 октября 2009

Представьте, что я хочу создать массив из другого массива, например так:

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

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

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

Ответы [ 5 ]

2 голосов
/ 27 октября 2009

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

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

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

$template = array('key1', 'key2', 'key3');
$array = array_merge($template, $otherarray);
1 голос
/ 23 октября 2009

Возможность будет:

   $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'] : '')
     );

Если это будет происходить более динамично, я бы предложил использовать 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.

1 голос
/ 23 октября 2009

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

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

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

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

0 голосов
/ 23 октября 2009

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

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

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

0 голосов
/ 23 октября 2009

Вы хотите извлечь определенные ключи из array1 и установить несуществующие ключи в пустую строку, если я вас правильно понял. Сделай так:

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