Удалить массив в цикле, если элементы имеют другой тип переменной

Здравствуйте, у меня есть проблема, слишком трудно решить …
у меня есть многомерный массив и я хочу удалить каждый элемент, который является переменным другого типа.
Я хотел бы проверить, что все элементы имеют правильные данные.

<?php
$array48mom = Array(
Array(1530270934000,19.4034,-155.2675,3,1,'E',612),
Array('1530270934000',19.4034,-155.2675,3,2,'E',612),
Array(1530270934000,19.4034,-155.2675,3,3,'E',612)
);
?>

А теперь код с функцией:

<?php
$array48mom = pulisci_array48mom($array48mom);

function pulisci_array48mom(&$array48mom){
for($i = 0; $i < count($array48mom); $i++) {
if( (
(is_int($array48mom[$i][0]) == true)
|| (is_double($array48mom[$i][1]) == true)
|| (is_double($array48mom[$i][2])== true)
|| (is_numeric($array48mom[$i][3]) == true)
|| (is_numeric($array48mom[$i][4]) == true)
|| (is_string($array48mom[$i][5]) == true)
|| (is_int($array48mom[$i][6]) == true)) == false
){
unset($array48mom[$i]);
}
}
$array48mom = array_values($array48mom);
return $array48mom;
}
print_r($array48mom);
?>

ВЫХОД должно быть так:

Array
(
[0] => Array
(
[0] => 1530270934000
[1] => 19.4034
[2] => -155.2675
[3] => 3
[4] => 1
[5] => 'E'
[6] => 612
)

[1] => Array
(
[0] => 1530270934000
[1] => 19.4034
[2] => -155.2675
[3] => 3
[4] => 3
[5] => 'E'
[6] => 612
)

)

но я не знаю, почему oputput этого кода это:

Array
(
[0] => Array
(
[0] => 1530270934000
[1] => 19.4034
[2] => -155.2675
[3] => 3
[4] => 1
[5] => E
[6] => 612
)

[1] => Array
(
[0] => 1530270934000
[1] => 19.4034
[2] => -155.2675
[3] => 3
[4] => 2
[5] => E
[6] => 612
)

[2] => Array
(
[0] => 1530270934000
[1] => 19.4034
[2] => -155.2675
[3] => 3
[4] => 3
[5] => E
[6] => 612
)

)

0

Решение

Читаемый код гораздо легче отлаживать, например:

function pulisci_array48mom(array $input): array {
// filter the input,        by
return array_filter($input, function ($entry) {

// each index
return is_int($entry[0])
&& is_double($entry[1])
&& is_double($entry[2])
&& is_numeric($entry[3])
&& is_numeric($entry[4])
&& is_string($entry[5])
&& is_int($entry[6]);
});
}

$input = pulisci_array48mom([
[1530270934000,   19.4034, -155.2675, 3, 1, 'E', 612],
['1530270934000', 19.4034, -155.2675, 3, 2, 'E', 612],
[1530270934000,   19.4034, -155.2675, 3, 3, 'E', 612],
]);

print_r($input);

демо: https://3v4l.org/vccgY

3

Другие решения

Прежде всего, не сравнивайте результаты булевых функций с true или же false Вы можете просто использовать их напрямую.

Если вам нужно проверить, возвращает ли булева функция ложь, добавьте перед ней оператор NOT, !

if( !is_int($var) )

читается как if $var is not an integer

Кроме того, не изменяйте массив из его начального цикла. Храните индексы там, где вы хотите изменить и повторять эти индексы. Я добавил $todelete массив, где я храню индексы элементов для удаления. Затем я перебираю этот массив и удаляю эти индексы в исходном массиве.

Я также изменил ваше заявление if, чтобы оно было более понятным.

Все элементы вернут false, если они будут такими, какими они должны быть. Если кто-то не соответствует тому, что разрешено, он вернет истину, и удовлетворяет OR.

Вы также можете сделать обратное, удалить операторы НЕ ! и заменить операторы ИЛИ || с операторами AND &&

Смотрите это онлайн: https://ideone.com/oUHTKR

<?php
$array48mom = [
[1530270934000, 19.4034, -155.2675, 3, 1, 'E', 612],
['1530270934000', 19.4034, -155.2675, 3, 2, 'E', 612],
[1530270934000, 19.4034, -155.2675, 3, 3, 'E', 612]
];
$array48mom = pulisci_array48mom($array48mom);

function pulisci_array48mom(&$array48mom){
$todelete = [];
for($i = 0; $i < count($array48mom); $i++) {
if(
!is_int($array48mom[$i][0])
|| !is_double($array48mom[$i][1])
|| !is_double($array48mom[$i][2])
|| !is_numeric($array48mom[$i][3])
|| !is_numeric($array48mom[$i][4])
|| !is_string($array48mom[$i][5])
|| !is_int($array48mom[$i][6])
){
$todelete[] = $i;
}
}
foreach($todelete as $key) {
unset($array48mom[$key]);
}
$array48mom = array_values($array48mom);
return $array48mom;
}
print_r($array48mom);

Что было бы даже лучше, чем использовать собственную функцию array_filter как выделено в ответ Йоши

2

Все хорошо, чтобы ожидать это изменение || в &&

<?php
$array48mom = pulisci_array48mom($array48mom);

function pulisci_array48mom(&$array48mom){
for($i = 0; $i < count($array48mom); $i++) {
if( (
(is_int($array48mom[$i][0]) == true)
&& (is_double($array48mom[$i][1]) == true)
&& (is_double($array48mom[$i][2])== true)
&& (is_numeric($array48mom[$i][3]) == true)
&& (is_numeric($array48mom[$i][4]) == true)
&& (is_string($array48mom[$i][5]) == true)
&& (is_int($array48mom[$i][6]) == true)) == false
){
unset($array48mom[$i]);
}
}
$array48mom = array_values($array48mom);
return $array48mom;
}
print_r($array48mom);

?>

1

Попробуйте это, приятель!

<?php

$array48mom = Array(
Array(1530270934000,19.4034,-155.2675,3,1,'E',612),
Array('1530270934000',19.4034,-155.2675,3,2,'E',612),
Array(1530270934000,19.4034,-155.2675,3,3,'E',612)
);

$array48mom = pulisci_array48mom($array48mom);

function pulisci_array48mom(&$array48mom){
for($i = 0; $i < count($array48mom); $i++) {
if(
(is_int($array48mom[$i][0]))!== true
|| (is_double($array48mom[$i][1])) !== true
|| (is_double($array48mom[$i][2])) !== true
|| (is_numeric($array48mom[$i][3])) !== true
|| (is_numeric($array48mom[$i][4]))!== true
|| (is_string($array48mom[$i][5])) !== true
|| (is_int($array48mom[$i][6]))!== true
){
echo "UNSET {$i}\r\n";
unset($array48mom[$i]);
}
}
$array48mom = array_values($array48mom);
return $array48mom;
}
print_r($array48mom);
0
По вопросам рекламы [email protected]