#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 ни один из способов не является неправильным, особенно когда я использовал формат, используемый операцией….