Мой вопрос может показаться довольно простым, но я пробовал несколько методов, и ни один из них не дает правильного ответа.
У меня есть ассоциативный массив следующим образом:
$array = array("TB1_course" => array(null, 'CHEM 2E03', null, "BIO 1A03"),
"TB1_section" => array(null, 'CHEM 2E03', null, "BIO 1A03"),
"TB1_session" => array(null, 'CHEM 2E03', null, "BIO 1A03")
);
Теперь я хотел бы удалить все нулевые элементы в моих массивах для соответствующего ассоциативного массива.
Моя попытка была следующей:
foreach($array as $key=>$value){
for($i=0; $i<sizeof($value);$i++){
if ($value[$i]==null){
unset($value[$i]);
}
$array[$key]=$value;
}
}
print_r($array);
Но мой вывод также повторно использует индексы массива. Мой вывод выглядит следующим образом:
Array
(
[TB1_course] => Array
(
[1] => CHEM 2E03
[3] => BIO 1A03
)
[TB1_section] => Array
(
[1] => CHEM 2E03
[3] => BIO 1A03
)
[TB1_session] => Array
(
[1] => CHEM 2E03
[3] => BIO 1A03
)
)
Я хотел бы удалить индексы, чтобы в моих массивах было только два элемента. «CHEM 2E03» должен быть 0-м индексом, а «BIO 1A03» должен быть 1-м индексом. Я использую PHP 5.4.
array_values()
Функция сохраняет значение и сбрасывает индексированный массив. Ниже это реализация для ваших целей:
foreach($array as $key=>$value){
for($i=0; $i<sizeof($value);$i++){
if ($value[$i]==null){
unset($value[$i]);
}
$array[$key] = array_values($value);
}
}
Вы можете использовать array_values()
функция для повторного индексирования вашего массива.
С помощью unset()
удаляет значение, но сохраняет ключ как есть.
Лучшее решение здесь будет использовать array_splice()
который удалит элемент полностью.
Для вашего кода это должно быть
array_splice($value, $i, 1);
вместо
unset($value[$i]);
пытаться
foreach($array as $key=>$value){
for($i=0; $i<sizeof($value);$i++){
if ($value[$i]==null){
unset($value[$i]);
}
$array[$key]=$value;
}
}
$arr = array_map('array_values', $array);
print_r($arr);
Вы можете использовать function
тогда это будет рекурсивно фильтровать и сбрасывать ваш индекс, используя array_filter
а также array_values
function array_filter_recursive($input)
{
foreach ($input as &$value)
{
if (is_array($value))
{
$value = array_filter_recursive($value);
}
}
return array_values(array_filter($input));
}
$array = [
"TB1_course" => array(null, 'CHEM 2E03', null, "BIO 1A03"),
"TB1_section" => array(null, 'CHEM 2E03', null, "BIO 1A03"),
"TB1_session" => array(null, 'CHEM 2E03', null, "BIO 1A03")
];
print_r(array_filter_recursive($array));
Вот phpfiddle для запуска выше: http://phpfiddle.org/main/code/cgbj-h10z
Ресурсы
1. http://php.net/manual/en/function.array-filter.php
2. http://php.net/manual/en/function.array-values.php