nur-sery/nur_src/io/csv/ut.php

155 lines
4.7 KiB
PHP
Raw Normal View History

2023-12-03 22:10:18 +04:00
<?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;
}
}