10 November 2009

Небольшая задачка по PHP

Есть два массива:

php > $a = array('one' => 1, 'two' => 2, 'three' => 3);
php > $b = array('one', 'three');

Первый ассоциативный массив — данные. Второй — обычный список ключей первого массива.

Нужно вырезать из первого массива все ключи, которых нет во втором массиве за минимальное количество строк кода:

php > var_dump($needed);
array(2) {
  ["one"]=>
  int(1)
  ["three"]=>
  int(3)
}

P. S. Просто интересная задача, которая возникла на практике.

8 comments:

guitarero said...

$needed = array_diff($a, array_diff_key($a, array_flip($b)));

Darth_Ashesss said...

$needed = array_intersect_key($a, array_flip($b));

Если есть возможность заранее создавать $b в виде array('one'=>'', 'three'=>''), то можно ещё укоротить до варината без array_flip

guitarero said...

$needed = compact(extract($a), $b);

Если уж совсем сокращать код :) Правда, порядок ключей в $needed будет как в $b, но на это, вроде, условие ограничений не накладывает :)

Alexey Shockov said...

У меня такой же вариант, как и у Darth_Ashesss :) Буква в букву.

guitarero said...

Ну, если у тебя кода не меньше, а других вариантов больше нет, тогда я выйграл! :)))

Alexey Shockov said...

Нужно было сказать, что с сохранением порядка ключей, чтобы ты не радовался :)

Как вариант, сегодня ещё проведу сравнение скорости различных решений. Просто ради интереса.

guitarero said...

Потестируй тогда и первое моё, любопытно будет взглянуть на это :)

guitarero said...

foreach ($b as $v) $needed[$v] = $a[$v];

Еще один способ, короче вашего, но опять порядок как в $b.