sonarrradarrplexorganizrnginxdashboardmuximuxlandingpagestartpagelandinghtpcserverhomepagesabnzbdheimdallembycouchpotatonzbgetbookmarkapplication-dashboard
		
		
		
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							99 lines
						
					
					
						
							2.8 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							99 lines
						
					
					
						
							2.8 KiB
						
					
					
				| <?php | |
| 
 | |
| /* | |
|  * This file is part of the Symfony package. | |
|  * | |
|  * (c) Fabien Potencier <fabien@symfony.com> | |
|  * | |
|  * For the full copyright and license information, please view the LICENSE | |
|  * file that was distributed with this source code. | |
|  */ | |
| 
 | |
| namespace Symfony\Component\Translation\Util; | |
| 
 | |
| /** | |
|  * ArrayConverter generates tree like structure from a message catalogue. | |
|  * e.g. this | |
|  *   'foo.bar1' => 'test1', | |
|  *   'foo.bar2' => 'test2' | |
|  * converts to follows: | |
|  *   foo: | |
|  *     bar1: test1 | |
|  *     bar2: test2. | |
|  * | |
|  * @author Gennady Telegin <gtelegin@gmail.com> | |
|  */ | |
| class ArrayConverter | |
| { | |
|     /** | |
|      * Converts linear messages array to tree-like array. | |
|      * For example this rray('foo.bar' => 'value') will be converted to array('foo' => array('bar' => 'value')). | |
|      * | |
|      * @param array $messages Linear messages array | |
|      * | |
|      * @return array Tree-like messages array | |
|      */ | |
|     public static function expandToTree(array $messages) | |
|     { | |
|         $tree = array(); | |
| 
 | |
|         foreach ($messages as $id => $value) { | |
|             $referenceToElement = &self::getElementByPath($tree, explode('.', $id)); | |
| 
 | |
|             $referenceToElement = $value; | |
| 
 | |
|             unset($referenceToElement); | |
|         } | |
| 
 | |
|         return $tree; | |
|     } | |
| 
 | |
|     private static function &getElementByPath(array &$tree, array $parts) | |
|     { | |
|         $elem = &$tree; | |
|         $parentOfElem = null; | |
| 
 | |
|         foreach ($parts as $i => $part) { | |
|             if (isset($elem[$part]) && is_string($elem[$part])) { | |
|                 /* Process next case: | |
|                  *    'foo': 'test1', | |
|                  *    'foo.bar': 'test2' | |
|                  * | |
|                  * $tree['foo'] was string before we found array {bar: test2}. | |
|                  *  Treat new element as string too, e.g. add $tree['foo.bar'] = 'test2'; | |
|                  */ | |
|                 $elem = &$elem[implode('.', array_slice($parts, $i))]; | |
|                 break; | |
|             } | |
|             $parentOfElem = &$elem; | |
|             $elem = &$elem[$part]; | |
|         } | |
| 
 | |
|         if (is_array($elem) && count($elem) > 0 && $parentOfElem) { | |
|             /* Process next case: | |
|              *    'foo.bar': 'test1' | |
|              *    'foo': 'test2' | |
|              * | |
|              * $tree['foo'] was array = {bar: 'test1'} before we found string constant `foo`. | |
|              * Cancel treating $tree['foo'] as array and cancel back it expansion, | |
|              *  e.g. make it $tree['foo.bar'] = 'test1' again. | |
|              */ | |
|             self::cancelExpand($parentOfElem, $part, $elem); | |
|         } | |
| 
 | |
|         return $elem; | |
|     } | |
| 
 | |
|     private static function cancelExpand(array &$tree, $prefix, array $node) | |
|     { | |
|         $prefix .= '.'; | |
| 
 | |
|         foreach ($node as $id => $value) { | |
|             if (is_string($value)) { | |
|                 $tree[$prefix.$id] = $value; | |
|             } else { | |
|                 self::cancelExpand($tree, $prefix.$id, $value); | |
|             } | |
|         } | |
|     } | |
| }
 | |
| 
 |