MyTetra Share
Делитесь знаниями!
О, смотри-ка какое хорошее место. Дайте два!
Примеры функций для обработки многомерных ассоциативных массивов в PHP5 (удаление, обход, очистка значений)
18.04.2017
21:00
Текстовые метки: PHP, PHP5, массив, ассоциативный, многомерный, элемент, удаление, обход, очистка значений
Раздел: Компьютер - Программирование - Язык PHP

Пример 1


Рекурсивное присвоение всем конечным элементам многомерного массива нуливого значения:


// Recursive clear values for assotiatve array

function clearItem($clearArray)

{

foreach ($clearArray as $key=>$value) {

if ( is_array($value) ) {

$clearArray[$key]=clearItem($value);

} else {

$clearArray[$key]=null;

}

}

return $clearArray;

}


То же самое с использованием array_walk_recursive() и именованной функции:


function clearItem(&$item,$key)

{

$item=null;

}


function arrayClear($clearArray)

{

array_walk_recursive($clearArray, 'clearItem');

return $clearArray;

}


Следует знать, что array_walk_recursive() обрабатывает все элементы на любом уровне вложенности кроме непосредственно самих элементов-подмассивов. То есть, обрабатываются только конечные элементы. Поэтому структура многомерного массива не нарушается.


То же самое через лямда-функцию:


function arrayClear($clearArray)

{

$clearItem=function(&$item, $key) { $item=null; };

array_walk_recursive($clearArray, $clearItem);

return $clearArray;

}



Пример 2


Удаление элеметов массива A, расположенных по таким же ключам в массиве B:


// Recursive remove element from assotiative array

public static function removeArrayElementRecursive($arrayA, $arrayB)

{

self::doRemoveArrayElementRecursive($arrayA, 'init');

return self::doRemoveArrayElementRecursive($arrayB, 'recurse');

}

public static function doRemoveArrayElementRecursive($currentArray, $mode, $currentKeys=array())

{

static $resultArray=array();

if($mode=='init') {

$resultArray=$currentArray;

return array();

}


if($mode=='recurse') {

foreach ($currentArray as $key=>$value) {

echo "\$CurrentArray: ".print_r($currentArray, true)."\n";

if ( is_array($value) ) {

$currentKeys[]=$key; // Append current level key

self::doRemoveArrayElementRecursive($value, 'recurse', $currentKeys);

} else {

echo "\nRemove value: ".$value."\n";

echo "\nRemove keys: ".print_r($currentKeys, true)."\n";

echo "\nBase array : ".print_r($resultArray, true)."\n";

$resultArray=self::removeElementByKeys($resultArray, $currentKeys);

}

}

}

return $resultArray;

}



Пример 3


Доступ к элементам по ключам, перечисленным в линейном массиве:


public static function getValueByKeys($a, $keys)

{

$item=&$a;

foreach ($keys as $key) {

if (array_key_exists($key, $item)) {

$item = &$item[$key];

} else {

throw new \Exception('While get value by keys, can not find key '.$key.' in array '.print_r($a, true));

}

}

return $item;

}



public static function removeElementByKeys($a, $keys)

{

if( !self::isMultiArray($a) ) {

throw new \Exception('Use standart PHP mechanism for remove element from linear array');

}

$item=&$a;

$beforeItem = null;

for ($i = 0; $i < count($keys); $i++) {

if ($i > 0)

$beforeItem = &$item;


$item = &$item[$keys[$i]];


if ($i === count($keys) - 1) {

unset($beforeItem[$keys[$i]]);

}

}

return $a;

}


Так же в этом разделе:
 
MyTetra Share v.0.52
Яндекс индекс цитирования