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;
 | 
						|
  }
 | 
						|
}
 |