Удалите некоторые ключи из массива внутри другого массива в PHP (Laravel)

#php #arrays #laravel

Вопрос:

Как удалить некоторые ключи из массива внутри другого массива в PHP? У меня есть такая структура:

 array (
  0 => 
  array (
    'num' => '123',
    'nome' => 'test 001'
    'pontos' => 68,
    'data_status' => '03/09/2021 10:05',
    'uuid_status' => '69450ea451ae11ea85ca309c23d3a0ed'
  ),
  1 => 
  array (
    'num' => '345',
    'nome' => 'test 002'
    'pontos' => 120,
    'data_status' => '27/08/2021 15:46',
    'uuid_status' => '3cbf4fd15d5411ea86956eef5d66cb13',
  ),
)
 

и нужно вернуть что-то вроде этого:

 array (
  0 => 
  array (
    'num' => '123',
    'nome' => 'test 001'
    'pontos' => 68
  ),
  1 => 
  array (
    'num' => '345',
    'nome' => 'test 002'
    'pontos' => 120
  )
)
 

Я видел некоторые ответы, но они кажутся устаревшими, кроме того, я использую Laravel, поэтому было бы полезно, если бы кто-нибудь указал мне что-то из фреймворка и его эквивалента в чистом PHP

Комментарии:

1. … Я видел некоторые ответы, но они кажутся устаревшими… Что не так с этими ответами? Что вы пробовали самостоятельно? С какими проблемами вы сталкиваетесь?

2. Пожалуйста, помните, что Laravel-это всего лишь фреймворк. Все это балансируется на PHP, поэтому все, что Laravel, по определению является PHP

3. может ли кто-нибудь указать мне правильный вариант? я попробовал Arr::единственный помощник от Laravel с возвращением этого: верните array_intersect_key($array, array_flip((массив) $ключи)); Но я не смог заставить его работать, потому что массив внутри массива, и я не знаю, как

4. Вы хотите удалить элементы из этого массива или создать новый массив без элементов, которые вам не нужны

5. Это связано с запросом? Если это так, вы можете просто выбрать, какие столбцы вам нужны в этот момент.

Ответ №1:

Простой цикл foreach-хорошая отправная точка, обратите внимание, что это приведет к удалению элементов из исходного массива, используя ссылку amp; на массив, а не обычную простую копию. О $val том, что в foreach ( $input as amp;$val){

 $input = [
    [   
        'num' => '123',
        'nome' => 'test 001',
        'pontos' => 68,
        'data_status' => '03/09/2021 10:05',
        'uuid_status' => '69450ea451ae11ea85ca309c23d3a0ed'
    ],[
        'num' => '345',
        'nome' => 'test 002',
        'pontos' => 120,
        'data_status' => '27/08/2021 15:46',
        'uuid_status' => '3cbf4fd15d5411ea86956eef5d66cb13'
    ]
];

$remove = ['data_status','uuid_status'];

foreach ( $input as amp;$val){
    foreach ($val as $k => $v) {
        if ( in_array($k,$remove) ) {
            unset( $val[$k]);
        }
    }
}
print_r($input);
 

Результат

 Array
(
    [0] => Array
        (
            [num] => 123
            [nome] => test 001
            [pontos] => 68
        )

    [1] => Array
        (
            [num] => 345
            [nome] => test 002
            [pontos] => 120
        )

)
 

Ответ №2:

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

 $bad_keys = array('data_status', 'uuid_status');




$array = array (
  0 => 
  array (
    'num' => '123',
    'nome' => 'test 001',
    'pontos' => 68,
    'data_status' => '03/09/2021 10:05',
    'uuid_status' => '69450ea451ae11ea85ca309c23d3a0ed',
  ),
  1 => 
  array (
    'num' => '345',
    'nome' => 'test 002',
    'pontos' => 120,
    'data_status' => '27/08/2021 15:46',
    'uuid_status' => '3cbf4fd15d5411ea86956eef5d66cb13',
  ),
);


function traverse_array($array, $bad_keys) {


foreach ($array as $key => $value) {
        
            if (is_array($value)) {
            
                    $array[$key] = traverse_array($value, $bad_keys);
            
            } else {
            
                    foreach ($bad_keys as $remove_me) {
            
                            if ($key == $remove_me) {
                
                                unset($array[$key]);
                    
                                }
                    }
        }
        
     }
     
     return $array;
}

print_r(traverse_array($array, $bad_keys));
 

Комментарии:

1. это позволит обрабатывать многомерные массивы, независимо от того, насколько глубоко они заходят

2. Пожалуйста, отформатируйте свой код и добавьте в него соответствующие отступы. Примечание: вы можете просто использовать современный способ определения массива, сделав $bad_keys = ['data_status', 'uuid_status']; то же самое для всех ваших массивов

3. под современным вы подразумеваете возраст старше 7 лет?

4. Вы забыли переформулировать свой вопрос. ..под современным вы подразумеваете возраст старше 7 лет? Да, безусловно! Интересно, знаете ли вы о 7 годах, почему вы все еще используете обозначения каменного века

5. это не каменный век, это все еще то, как это представлено в документах php: php.net/manual/en/language.types.array.php ни один из способов не является неправильным, особенно когда я использовал формат, используемый операцией….