Есть два массива:
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:
$needed = array_diff($a, array_diff_key($a, array_flip($b)));
$needed = array_intersect_key($a, array_flip($b));
Если есть возможность заранее создавать $b в виде array('one'=>'', 'three'=>''), то можно ещё укоротить до варината без array_flip
$needed = compact(extract($a), $b);
Если уж совсем сокращать код :) Правда, порядок ключей в $needed будет как в $b, но на это, вроде, условие ограничений не накладывает :)
У меня такой же вариант, как и у Darth_Ashesss :) Буква в букву.
Ну, если у тебя кода не меньше, а других вариантов больше нет, тогда я выйграл! :)))
Нужно было сказать, что с сохранением порядка ключей, чтобы ты не радовался :)
Как вариант, сегодня ещё проведу сравнение скорости различных решений. Просто ради интереса.
Потестируй тогда и первое моё, любопытно будет взглянуть на это :)
foreach ($b as $v) $needed[$v] = $a[$v];
Еще один способ, короче вашего, но опять порядок как в $b.
Post a Comment