|
|||||||
Примеры функций для обработки многомерных ассоциативных массивов в PHP5 (удаление, обход, очистка значений)
Время создания: 18.04.2017 21:00
Текстовые метки: PHP, PHP5, массив, ассоциативный, многомерный, элемент, удаление, обход, очистка значений
Раздел: Компьютер - Программирование - Язык PHP
Запись: xintrea/mytetra_syncro/master/base/1492538457z159emrrws/text.html на raw.github.com
|
|||||||
|
|||||||
Пример 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; } |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|