У меня есть ассоциативный массив под названием $post_data
следующее. Фактический массив очень большой для вашей справки. Я просто помещаю под него два элемента:
Array
(
[0] => Array
(
[feed_id] => 1331
[app_id] => 0
[privacy] => 0
[privacy_comment] => 0
[type_id] => user_status
[user_id] => 244
[parent_user_id] => 0
[item_id] => 140
[time_stamp] => 1424256681
[feed_reference] => 0
[parent_feed_id] => 0
[parent_module_id] =>
[time_update] => 1424256681
[app_title] =>
[profile_page_id] => 0
[user_server_id] => 0
[user_name] => profile-244
[full_name] => Campusknot .
[gender] => 0
[user_image] => 2015/02/0f34dbb95ce18b17611220b78c87f9a6%s.png
[is_invisible] => 0
[user_group_id] => 7
[language_id] =>
[feed_time_stamp] => 1424256681
[can_post_comment] => 1
[feed_status] => feed with smily <img src="http://34.144.40.142/file/pic/emoticon/default/smile.png" alt="Smile" title="Smile" title="v_middle" />
[feed_title] =>
[feed_link] => http://34.144.40.142/profile-244/status-id_140/
[total_comment] => 0
[feed_total_like] => 0
[feed_is_liked] =>
[feed_icon] => http://34.144.40.142/theme/frontend/foxplus/style/default/image/misc/application_add.png
[enable_like] => 1
[comment_type_id] => user_status
[like_type_id] => user_status
[likes] => Array
(
)
[marks] => Array
(
)
[bShowEnterCommentBlock] =>
[feed_month_year] => 02_2015
[feed_like_phrase] =>
[profile_image] => http://34.144.40.142/file/pic/user/2015/02/0f34dbb95ce18b17611220b78c87f9a6_50_square.png
[feed_image] =>
[user_group_name] => faculty
)
[1] => Array
(
[feed_id] => 1310
[app_id] => 0
[privacy] => 0
[privacy_comment] => 0
[type_id] => photo
[user_id] => 244
[parent_user_id] => 0
[item_id] => 606
[time_stamp] => 1424235811
[feed_reference] => 0
[parent_feed_id] => 0
[parent_module_id] =>
[time_update] => 1424235811
[app_title] =>
[profile_page_id] => 0
[user_server_id] => 0
[user_name] => profile-244
[full_name] => Campusknot .
[gender] => 0
[user_image] => 2015/02/0f34dbb95ce18b17611220b78c87f9a6%s.png
[is_invisible] => 0
[user_group_id] => 7
[language_id] =>
[feed_time_stamp] => 1424235811
[can_post_comment] => 1
[feed_title] =>
[feed_image] => http://34.144.40.142/file/pic/photo/2015/02/02ff1a23db112db834b8f41748242bcb_240.png
[feed_status] => new_image
[feed_link] => http://34.144.40.142/photo/606/after_login/userid_244/
[total_comment] => 0
[feed_total_like] => 1
[feed_is_liked] => 910
[feed_icon] => http://34.144.40.142/theme/frontend/foxplus/style/default/image/module/photo.png
[enable_like] => 1
[comment_type_id] => photo
[like_type_id] => photo
[custom_css] => js_photo_item_606 photo_holder_image
[custom_rel] => 606
[custom_js] =>
[no_target_blank] => 1
[custom_data_cache] => Array
(
[parent_user_id] => 0
[parent_profile_page_id] =>
[user_parent_server_id] =>
[parent_user_name] =>
[parent_full_name] =>
[parent_gender] =>
[parent_user_image] =>
[parent_is_invisible] =>
[parent_user_group_id] =>
[parent_language_id] =>
[photo_id] => 606
[album_id] =>
[view_id] => 0
[module_id] =>
[group_id] => 0
[type_id] => 1
[privacy] => 0
[privacy_comment] => 0
[title] => after_login
[user_id] => 244
[destination] => 2015/02/02ff1a23db112db834b8f41748242bcb%s.png
[server_id] => 0
[mature] => 0
[allow_comment] => 0
[allow_rate] => 0
[time_stamp] => 1424235811
[total_view] => 0
[total_comment] => 0
[total_download] => 0
[total_rating] => 0.00
[total_vote] => 0
[total_battle] => 0
[total_like] => 1
[total_dislike] => 0
[is_featured] => 0
[is_cover] => 0
[allow_download] => 0
[is_sponsor] => 0
[ordering] => 0
[is_profile_photo] => 0
[is_liked] => 910
[description] => new_image
[extra_photo_id] =>
[name] =>
)
[feed_info] => posted a photo
[likes] => Array
(
[244] => Array
(
[like_id] => 910
[type_id] => photo
[item_id] => 606
[user_id] => 244
[time_stamp] => 1424247486
[profile_page_id] => 0
[user_server_id] => 0
[user_name] => profile-244
[full_name] => Campusknot .
[gender] => 0
[user_image] => 2015/02/0f34dbb95ce18b17611220b78c87f9a6%s.png
[is_invisible] => 0
[user_group_id] => 7
[language_id] =>
[action_time_stamp] =>
)
)
[marks] => Array
(
)
[bShowEnterCommentBlock] => 1
[feed_month_year] => 02_2015
[feed_like_phrase] => You like this.
[profile_image] => http://34.144.40.142/file/pic/user/2015/02/0f34dbb95ce18b17611220b78c87f9a6_50_square.png
[user_group_name] => faculty
)
)
Фактический массив довольно большой. Я хочу эффективный и оптимальный способ, который удаляет пары ключ-значение из вышеуказанного массива, который содержит ноль (то есть ничего) (включая внутренние массивы везде, где они есть).
Я не хочу сбрасывать нулевые значения из соответствующих ключей, содержащих нулевое значение, я хочу удалить соответствующую пару ключ-значение из массива $post_data
и в результате я должен вымыться $post_data
массив.
По сути, я не хочу проходить через весь ассоциативный массив (то есть перебирать все имеющиеся внутренние массивы и проверять каждую пару ключ-значение в нем на предмет проверки на нулевое значение). Это будет более сложным и трудоемким. Я хочу, чтобы сделать это с помощью встроенной функции массива PHP, как array_filter()
или что-то другое. Я пытался с помощью array_filter()
но это не сработало для меня. Я думаю, что я делаю какую-то ошибку в использовании этой функции.
Я попробовал следующий код, но он не сработал.
foreach($post_data as $key=>$value) {
array_filter($value);
if(is_array($value)) {
foreach($value as $k=>$v)
array_filter($v);
if(is_array($v)){
foreach($v as $ke=>$va)
array_filter($va);
}
}
}
Согласно вашему запросу, здесь есть функция, которая не использует циклов для рекурсивного удаления. null
использование индексов массива array_filter
.
function array_filter_null_recursive( $array ) {
//Filter the elements with a custom callback function, passing value as reference.
return array_filter( $array, function( &$value ) {
//If this element is an array, recursivly filter and modify the array.
if ( is_array( $value ) ) {
$value = array_filter_null_recursive( $value );
return true;
}
//Otherwise, check if null.
return ! is_null( $value );
} );
}
$array = array(
'a' => 1,
'b' => null,
'c' => array(
'a' => null,
'b' => 2,
'c' => array(
'a' => 1,
'b' => null,
)
),
'd' => null,
'e' => 5,
);
print_r( array_filter_null_recursive( $array ) );
Array
(
[a] => 1
[c] => Array
(
[b] => 2
[c] => Array
(
[a] => 1
)
)
[e] => 5
)
Тем не менее, если вам важна скорость, лучше использовать цикл со ссылками. В моем коротком тестировании эта функция в среднем немного быстрее выполняла со 100 000 вызовов на тест.
function array_filter_null_recursive( $array ) {
foreach ( $array as $k=>&$v ) {
if ( is_null( $v ) ) {
unset( $array[$k] );
}
elseif ( is_array( $v ) ) {
$v = array_filter_null_recursive( $v );
}
}
return $array;
}
<?php
$array = array(
'a' => 'a',
'b' => null,
'c' => array(
'a' => null,
'b' => 'b',
),
'd' => array(
'a' => null
)
);
$result = array_walk_recursive_delete($array);
echo"<pre>";
print_r($result);
echo"<pre>";
function array_walk_recursive_delete(array $array) {
foreach ($array as $key => $value) {
if (is_array($value)) {
$value = array_walk_recursive_delete($value);
}
if ($value == null) {
unset($array[$key]);
}
}
return $array;
}
Вот простая рекурсивная версия array_filter:
function mfilter($obj) {
if (!is_array($obj)) return $obj;
return array_map("mfilter", array_filter($obj));
}
Я думаю, что суть в ответах выше, но так как я потратил пару часов на сравнение различных функций и итераторов, я мог бы также добавить то, что выполнялось быстрее всего для моей установки (5.6. Что-то):
<?php
$testData = array(
'a' => "",
'b' => 0,
'c' => "0",
'd' => 1,
'e' => "1",
'f' => 0.12,
'g' => "0.12",
'h' => array(),
'i' => array(
array()
),
'j' => array(
array(
array()
)
),
'k' => array(
'k1' => array(
'k1a' => array(),
)
),
'l' => array(
'l1' => array(),
'l2' => 2,
'l3' => array(
'l3a' => 1,
'l3b' => array()
)
),
array(),
"testString");
$result = array_filter($testData, $f = function(&$v) use (&$f) {
if (is_array($v) && $v) {
$v = array_filter($v, $f);
}
return (is_array($v) && $v) || (!is_array($v) && trim($v) !== "");
});
print_r($result);
Если вам нужно сохранить пустые строки, нулевые числа и т. Д., Но удалить только те значения, которые являются нулевыми, в точности используйте следующий код с функцией обратного вызова, в противном случае просто удалите параметр обратного вызова.
$array = array(
'a' => 1,
'b' => null,
'c' => array(
'a' => null,
'b' => 2,
'c' => array(
'a' => 1,
'b' => null,
),
'd' => '',
'e' => 0
),
'd' => null,
'e' => 5,
);
function array_filter_recursive($input, $callback)
{
foreach ($input as &$value) {
if (is_array($value)) {
$value = array_filter_recursive($value, $callback);
}
}
return array_filter($input, $callback);
}
print_r(array_filter_recursive(
$array,
function ($val) {
return !is_null($val);
}
));