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