2017-02-06 7 views
0

У меня есть многомерный массив PHP и вы хотите удалить любые элементы (на основе строк), которые не соответствуют значению.PHP - Удалить из многомерного массива по значению

Например:

$user_types = [ 
    0 => ['ut_id' => 32, 'type' => 'admin'], 
    1 => ['ut_id' => 31, 'type' => 'user'], 
    2 => ['ut_id' => 801, 'type' => 'editor'] 
]; 

Скажем, я хочу только элемент, где 'type' == 'admin'. Я хочу, чтобы выход был:

$user_types = [ 
    0 => ['ut_id' => 32, 'type' => 'admin'] 
] 

Мне также нужно убедиться, что массив последовательно вводится. Поэтому, если я хочу только type == 'editor', ключ массива должен быть равен 0 (не 2), например.

$user_types = [ 
    0 => ['ut_id' => 801, 'type' => 'editor'] 
] 

Я имел взгляд на PHP array delete by value (not key), но это не имеет дело с многомерными массивами.

Я также видел некоторые решения, которые используют цикл foreach, но это кажется довольно неэффективным.

Пожалуйста, может кто-нибудь указать мне в сторону, на что посмотреть? Я не могу найти примеров, которые касаются этого, когда дело доходит до многомерных массивов. Я видел Delete element from multidimensional-array based on value, но это кажется неэффективным и было написано около 6 лет назад.

+0

Я хотел бы посмотреть в многомерных массивов поисков и идти оттуда. Отмечу, что числовые индексированные массивы всегда начинаются с '0'. У вас не может быть одного элемента с ключом '2'. –

+1

http://php.net/manual/en/function.array-filter.php в сочетании с 'array_values'. – jeroen

+1

@StuartWagner Да, вы можете, нет такого ограничения на ключ массива в php. – jeroen

ответ

2

Вы можете использовать РНР array_filter() функция здесь:

<?php 
$user_types = [ 
    0 => ['ut_id' => 32, 'type' => 'admin'], 
    1 => ['ut_id' => 31, 'type' => 'user'], 
    2 => ['ut_id' => 801, 'type' => 'editor'] 
]; 

$type = 'admin'; 
print_r(
    array_values(
     array_filter($user_types, function($entry) use ($type){ 
      return $entry['type'] === $type; 
     }) 
    ) 
); 

$type = 'editor'; 
print_r(
    array_values(
     array_filter($user_types, function($entry) use ($type){ 
      return $entry['type'] === $type; 
     }) 
    ) 
); 

Выход выше код:

Array 
(
    [0] => Array 
     (
      [ut_id] => 32 
      [type] => admin 
     ) 

) 
Array 
(
    [0] => Array 
     (
      [ut_id] => 801 
      [type] => editor 
     ) 

) 
+0

Работает отлично и очень эффективно, спасибо. Примите как ответ в течение нескольких минут, когда SO позволит мне :) – Andy

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