155 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace nur\io\csv;
 | |
| 
 | |
| use nur\A;
 | |
| 
 | |
| class ut {
 | |
|   static function split_header_mappings(array $header_mappings): array {
 | |
|     $includes = [];
 | |
|     $excludes = [];
 | |
|     $index = 0;
 | |
|     foreach ($header_mappings as $dest => $source) {
 | |
|       if ($dest === $index) {
 | |
|         $index++;
 | |
|         $includes[$source] = true;
 | |
|       } elseif ($source === null) {
 | |
|         $excludes[$dest] = true;
 | |
|       }
 | |
|     }
 | |
|     return [$includes, $excludes];
 | |
|   }
 | |
| 
 | |
|   static function reader_map_keys(array $row, ?array $header_mappings): array {
 | |
|     if ($header_mappings === null) return $row;
 | |
|     # tout d'abord, recenser includes et excludes
 | |
|     [$includes, $excludes] = self::split_header_mappings($header_mappings);
 | |
|     $mapped = [];
 | |
|     if ($includes) {
 | |
|       # on spécifie des champs à inclure: n'inclure que ceux-là et dans
 | |
|       # l'ordre du mapping, en les mappant le cas échéant
 | |
|       $index = 0;
 | |
|       foreach ($header_mappings as $dest => $source) {
 | |
|         if ($dest === $index) {
 | |
|           $index++;
 | |
|           # inclure
 | |
|           $dest = $source;
 | |
|           $mapped[$dest] = A::get($row, $dest);
 | |
|         } elseif ($source !== null) {
 | |
|           # mapper
 | |
|           $mapped[$dest] = A::get($row, $source);
 | |
|         }
 | |
|       }
 | |
|       $row = $mapped;
 | |
|     } else {
 | |
|       # on ne spécifie pas les champs à inclure: inclure tous les champs en
 | |
|       # les mappant le cas échéant, et dans l'ordre original
 | |
|       foreach ($row as $key => $value) {
 | |
|         # exclure les champs de $excludes
 | |
|         if (array_key_exists($key, $excludes)) continue;
 | |
|         # mapper le cas échéant
 | |
|         $index = 0;
 | |
|         $found = false;
 | |
|         foreach ($header_mappings as $dest => $source) {
 | |
|           if ($dest === $index) {
 | |
|             $index++;
 | |
|           } elseif ($source === $key) {
 | |
|             $mapped[$dest] = $value;
 | |
|             $found = true;
 | |
|             break;
 | |
|           }
 | |
|         }
 | |
|         if (!$found) $mapped[$key] = $value;
 | |
|       }
 | |
|       $row = $mapped;
 | |
|     }
 | |
|     return $row;
 | |
|   }
 | |
| 
 | |
|   static function writer_map_headers(array $headers, ?array $header_mappings): array {
 | |
|     if ($header_mappings === null) return $headers;
 | |
|     # tout d'abord, recenser includes et excludes
 | |
|     [$includes, $excludes] = self::split_header_mappings($header_mappings);
 | |
|     $mapped = [];
 | |
|     if ($includes) {
 | |
|       # on spécifie des champs à inclure: n'inclure que ceux-là et dans
 | |
|       # l'ordre du mapping, en les mappant le cas échéant
 | |
|       $index = 0;
 | |
|       foreach ($header_mappings as $source => $dest) {
 | |
|         if ($source === $index) {
 | |
|           $index++;
 | |
|           # inclure
 | |
|           $mapped[] = $dest;
 | |
|         } elseif ($dest === null) {
 | |
|           # exclure
 | |
|           $mapped[] = $source;
 | |
|         } else {
 | |
|           # mapper
 | |
|           $mapped[] = $dest;
 | |
|         }
 | |
|       }
 | |
|       $headers = $mapped;
 | |
|     } else {
 | |
|       # on ne spécifie pas les champs à inclure: inclure tous les champs en
 | |
|       # les mappant le cas échéant, et dans l'ordre original
 | |
|       foreach ($headers as $header) {
 | |
|         $found = false;
 | |
|         foreach ($header_mappings as $source => $dest) {
 | |
|           if ($source === $header) {
 | |
|             if ($dest === null) $mapped[] = $source;
 | |
|             else $mapped[] = $dest;
 | |
|             $found = true;
 | |
|             break;
 | |
|           }
 | |
|         }
 | |
|         if (!$found) $mapped[] = $header;
 | |
|       }
 | |
|       $headers = $mapped;
 | |
|     }
 | |
|     return $headers;
 | |
|   }
 | |
| 
 | |
|   static function writer_map_keys(array $row, ?array $header_mappings): array {
 | |
|     if ($header_mappings === null) return $row;
 | |
|     # tout d'abord, recenser includes et excludes
 | |
|     [$includes, $excludes] = self::split_header_mappings($header_mappings);
 | |
|     $mapped = [];
 | |
|     if ($includes) {
 | |
|       # on spécifie des champs à inclure: n'inclure que ceux-là et dans
 | |
|       # l'ordre du mapping, en les mappant le cas échéant
 | |
|       $index = 0;
 | |
|       foreach ($header_mappings as $source => $dest) {
 | |
|         if ($source === $index) {
 | |
|           $index++;
 | |
|           # inclure
 | |
|           $mapped[$dest] = A::get($row, $dest);
 | |
|         } elseif ($dest === null) {
 | |
|           # "exclure"
 | |
|           $mapped[$source] = null;
 | |
|         } else {
 | |
|           # mapper
 | |
|           $mapped[$dest] = A::get($row, $source);
 | |
|         }
 | |
|       }
 | |
|       $row = $mapped;
 | |
|     } else {
 | |
|       # on ne spécifie pas les champs à inclure: inclure tous les champs en
 | |
|       # les mappant le cas échéant, et dans l'ordre original
 | |
|       foreach ($row as $header => $value) {
 | |
|         # mapper le cas échéant
 | |
|         $found = false;
 | |
|         foreach ($header_mappings as $source => $dest) {
 | |
|           if ($source === $header) {
 | |
|             if ($dest === null) $mapped[$source] = null;
 | |
|             else $mapped[$dest] = $value;
 | |
|             $found = true;
 | |
|             break;
 | |
|           }
 | |
|         }
 | |
|         if (!$found) $mapped[$header] = $value;
 | |
|       }
 | |
|       $row = $mapped;
 | |
|     }
 | |
|     return $row;
 | |
|   }
 | |
| }
 |