PHP Рекурсивно отключает ключи массива, если они совпадают

У меня есть следующий массив, который мне нужно для рекурсивного цикла и удаления любых дочерних массивов, имеющих ключевые «поля». Я попробовал фильтр массива, но у меня возникли проблемы с его работой.

$myarray = array( 'Item' => array( 'fields' => array('id', 'name'), 'Part' => array( 'fields' => array('part_number', 'part_name') ) ), 'Owner' => array( 'fields' => array('id', 'name', 'active'), 'Company' => array( 'fields' => array('id', 'name',), 'Locations' => array( 'fields' => array('id', 'name', 'address', 'zip'), 'State' => array( 'fields' => array('id', 'name') ) ) ) ) ); 

Вот как мне нужно, чтобы результат выглядел так:

 $myarray = array( 'Item' => array( 'Part' => array( ) ), 'Owner' => array( 'Company' => array( 'Locations' => array( 'State' => array( ) ) ) ) ); 

Если вы хотите работать рекурсивно, вам нужно передать массив в качестве ссылки , иначе вы делаете много ненужного копирования:

 function recursive_unset(&$array, $unwanted_key) { unset($array[$unwanted_key]); foreach ($array as &$value) { if (is_array($value)) { recursive_unset($value, $unwanted_key); } } } с function recursive_unset(&$array, $unwanted_key) { unset($array[$unwanted_key]); foreach ($array as &$value) { if (is_array($value)) { recursive_unset($value, $unwanted_key); } } } 

вы хотите array_walk

 function remove_key(&$a) { if(is_array($a)) { unset($a['fields']); array_walk($a, __FUNCTION__); } } remove_key($myarray); не function remove_key(&$a) { if(is_array($a)) { unset($a['fields']); array_walk($a, __FUNCTION__); } } remove_key($myarray); 
 function recursive_unset(&$array, $unwanted_key) { if (!is_array($array) || empty($unwanted_key)) return false; unset($array[$unwanted_key]); foreach ($array as &$value) { if (is_array($value)) { recursive_unset($value, $unwanted_key); } } } с function recursive_unset(&$array, $unwanted_key) { if (!is_array($array) || empty($unwanted_key)) return false; unset($array[$unwanted_key]); foreach ($array as &$value) { if (is_array($value)) { recursive_unset($value, $unwanted_key); } } } 

Мое предложение:

 function removeKey(&$array, $key) { if (is_array($array)) { if (isset($array[$key])) { unset($array[$key]); } if (count($array) > 0) { foreach ($array as $k => $arr) { removeKey($array[$k], $key); } } } } removeKey($myarray, 'Part'); с function removeKey(&$array, $key) { if (is_array($array)) { if (isset($array[$key])) { unset($array[$key]); } if (count($array) > 0) { foreach ($array as $k => $arr) { removeKey($array[$k], $key); } } } } removeKey($myarray, 'Part'); 
 function sanitize($arr) { if (is_array($arr)) { $out = array(); foreach ($arr as $key => $val) { if ($key != 'fields') { $out[$key] = sanitize($val); } } } else { return $arr; } return $out; } $myarray = sanitize($myarray); 

Результат:

 array ( 'Item' => array ( 'Part' => array ( ), ), 'Owner' => array ( 'Company' => array ( 'Locations' => array ( 'State' => array ( ), ), ), ), ) 

Дайте этой функции выстрел. Он удалит ключи с «полями» и оставит остальную часть массива.

 function unsetFields($myarray) { if (isset($myarray['fields'])) unset($myarray['fields']); foreach ($myarray as $key => $value) $myarray[$key] = unsetFields($value); return $myarray; } не function unsetFields($myarray) { if (isset($myarray['fields'])) unset($myarray['fields']); foreach ($myarray as $key => $value) $myarray[$key] = unsetFields($value); return $myarray; } 
 function removeRecursive($haystack,$needle){ if(is_array($haystack)) { unset($haystack[$needle]); foreach ($haystack as $k=>$value) { $haystack[$k] = removeRecursive($value,$needle); } } return $haystack; } $new = removeRecursive($old,'key'); с function removeRecursive($haystack,$needle){ if(is_array($haystack)) { unset($haystack[$needle]); foreach ($haystack as $k=>$value) { $haystack[$k] = removeRecursive($value,$needle); } } return $haystack; } $new = removeRecursive($old,'key'); 

Код:

 $sweet = array('a' => 'apple', 'b' => 'banana'); $fruits = array('sweet' => $sweet, 'sour' => $sweet); function recursive_array_except(&$array, $except) { foreach($array as $key => $value){ if(in_array($key, $except, true)){ unset($array[$key]); }else{ if(is_array($value)){ recursive_array_except($array[$key], $except); } } } return; } recursive_array_except($fruits, array('a')); print_r($fruits); с $sweet = array('a' => 'apple', 'b' => 'banana'); $fruits = array('sweet' => $sweet, 'sour' => $sweet); function recursive_array_except(&$array, $except) { foreach($array as $key => $value){ if(in_array($key, $except, true)){ unset($array[$key]); }else{ if(is_array($value)){ recursive_array_except($array[$key], $except); } } } return; } recursive_array_except($fruits, array('a')); print_r($fruits); 

Входные данные:

 Array ( [sweet] => Array ( [a] => apple [b] => banana ) [sour] => Array ( [a] => apple [b] => banana ) ) 

Вывод:

 Array ( [sweet] => Array ( [b] => banana ) [sour] => Array ( [b] => banana ) ) 

Рекурсивно пройдите по массиву (по ссылке) и отмените соответствующие клавиши.

 clear_fields($myarray); print_r($myarray); function clear_fields(&$parent) { unset($parent['fields']); foreach ($parent as $k => &$v) { if (is_array($v)) { clear_fields($v); } } } с clear_fields($myarray); print_r($myarray); function clear_fields(&$parent) { unset($parent['fields']); foreach ($parent as $k => &$v) { if (is_array($v)) { clear_fields($v); } } } 

Мне нужно было иметь немного больше детализации в разборчивых массивах, и я придумал это – со злым eval и другими грязными трюками.

 $post = array(); //some huge array function array_unset(&$arr,$path){ $str = 'unset($arr[\''.implode('\'][\'',explode('/', $path)).'\']);'; eval($str); } $junk = array(); $junk[] = 'property_meta/_edit_lock'; $junk[] = 'property_terms/post_tag'; $junk[] = 'property_terms/property-type/0/term_id'; foreach($junk as $path){ array_unset($post,$path); } // unset($arr['property_meta']['_edit_lock']); // unset($arr['property_terms']['post_tag']); // unset($arr['property_terms']['property-type']['0']['term_id']);