PHP Recursively unset Dizi anahtarları ise maç

7 Cevap php

Ben aracılığıyla ardışık döngü gerekir ve anahtar 'alanları' olan herhangi bir alt dizileri kaldırın şu dizi var. Ben dizi filtre denedim ama bunun herhangi bir işe alma konusunda sorun yaşıyorum.

$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')
                )
            )
        )
    )    
);

Bu benim gibi bakmak için o sonuca ihtiyaç nasıl:

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

7 Cevap

Özyinelemeli işletmek istiyorsanız, aksi takdirde gereksiz yere kopyalama bir sürü yapmak, bir reference olarak dizi geçirmek gerekir:

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

Eğer array_walk istiyorum

function remove_key(&$a) {
   if(is_array($a)) {
     	unset($a['fields']);
     	array_walk($a, __FUNCTION__);
   }
}
remove_key($myarray);

Başka bir fonksiyonu zarar vermez :)

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

Bu işlev bir şans verin. Bu 'alanlar' ile anahtarları kaldırmak ve dizinin kalanı bırakın.

function unsetFields($myarray) {
    if (isset($myarray['fields']))
        unset($myarray['fields']);
    foreach ($myarray as $key => $value)
        $myarray[$key] = unsetFields($value);
    return $myarray;
}

Benim önerim:

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

Recursively (referans) dizi yürümek ve ilgili anahtarları unset.

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

Sonuç:

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