У меня есть следующий массив:

array(5) { 
    ["destino"]=> string(11) "op_list_gen" 
    ["id_terminal"]=> string(0) "" 
    ["marca"]=> string(2) "--" 
    ["tipo"]=> string(2) "--" 
    ["lyr_content"]=> string(14) "aawaw"
}

Как я могу удалить значения "-" и пустые из массива?

Я попытался использовать foreach и удалить элементы, найденные с unset, но это не работает.

foreach ($array as $key => $arra) {
        if(array_key_exists('--', $array)){ 
            unset($arra[$key]);
        }
}
1
MONZTAAA 21 Авг 2018 в 10:51

6 ответов

Лучший ответ

Вы можете использовать array_filter, чтобы решить эту проблему:

$arr = [
    "destino" => "op_list_gen",
    "id_terminal" => "",
    "marca" => "--",
    "tipo" => "--",
    "lyr_content" => "aawaw"
];

$newArr = array_filter($arr, function($value) {
    return !in_array($value, ['', '--']);
});

Демо: https://ideone.com/oot7lZ

3
Sebastian Brosch 21 Авг 2018 в 08:01
$array = [
    "destino" => "op_list_gen",
    "id_terminal" => "",
    "marca" => "--",
    "tipo" => "--",
    "lyr_content" => "aawaw"
];

$new_array = array_filter($array, function($item){
    if($item != '--' || $item != '')
        return $item;
})

var_dump($new_array) 

array_filter() будет принимать каждую запись и возвращать ее, если это не -- или ''

2
Shobi 21 Авг 2018 в 08:01

Вы можете удалить значения, просто зацикливаясь на массиве, создавая новый массив в процессе:

$myarray = array( 
  "destino" => "op_list_gen",
  "id_terminal" => "",
  "marca" => "--", 
  "tipo" => "--", 
  "lyr_content" => "aawaw",
}

$newarray = array();
foreach($myarray as $key => $value) {
    if($value != "--" && $value != "") {
        $newarray[$key] = $value;
  }
}

Или, что более элегантно, вы можете использовать функцию array_filter. Требуется функция обратного вызова, которая для каждого значения решает, включать ли его. Это также возвращает новый массив:

$newarray = array_filter($myarray, function($elem) {
    if($elem != "" && $elem != "--") return $elem;
});
0
Alexander van Oostenrijk 21 Авг 2018 в 08:01

Общий подход должен выглядеть так:

$filter = function(...$excluded) {
     return function ($value) use ($excluded) {
        return !in_array($value, $excluded);
  };
};

$newArray = array_filter($array, $filter('', '--'));

Этот подход пригоден для повторного использования, потому что вам не нужно жестко кодировать значения прямо в вашей функции фильтрации.

0
Alex 21 Авг 2018 в 08:16

Как говорят все остальные ответы, array_filter - это хороший путь об этом. Однако это возвращает новый массив и фактически не изменяет исходный массив. Если это то, что вы ищете, это может быть другой подход:

// Start infinite loop
while(true){
    // Check for value in array
    if (($key = array_search('--', $arr)) !== false || ($key = array_search('', $arr)) !== false) {
        // Unset the key
        unset($arr[$key]);
        // Reset array keys
        $arr = array_values($arr);
    } else {
        // No more matches found, break the loop
        break;
    }
}
0
icecub 21 Авг 2018 в 08:44

Используйте array_filter:

$original = [
    'destino' => 'op_list_get',
    'id_terminal' => '',
    'marca' => '--',
    'tipo' => '--',
    'lyr_content' => 'aawaw',
];

// values you want to filter away
$disallowArray = ['', '--'];
$filteredResult = array_filter($original, function($val) use($disallowArray) {
    // check that the value is not in our disallowArray
    return \in_array($val, $disallowArray, true) === false;
});

Результат:

Array
(
    [destino] => op_list_get
    [lyr_content] => aawaw
)
0
John Klakegg 21 Авг 2018 в 09:39
51944040