Удалить массив в цикле, если элементы имеют другой тип переменной - PullRequest
0 голосов
/ 29 июня 2018

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

<?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
    )

 )

Ответы [ 4 ]

0 голосов
/ 29 июня 2018

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

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

0 голосов
/ 29 июня 2018

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

<?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 голосов
/ 29 июня 2018

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

<?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);

?>

0 голосов
/ 29 июня 2018

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

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

if( !is_int($var) )

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

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

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

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

Вы также можете сделать обратное, удалить операторы NOT ! и заменить операторы 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 , как выделено в ответе Йоши

...