<?php
$input1 = '
имя1;им,я2;имя3
имя4;имя5;имя6
,имя7;имя,8;имя9
'; // ;
$input2 = '
;;;;;;;;;;;;ааа,ааа;;;;;;;;;;;
А;ааа,ааа;а
B;bbb,bbb;b
'; // ,
$input3 = '
имя1;имя2;имя3
им;я4,имя5,им;я6
имя4;имя5;имя6
'; // ;
$incorrectInput1 = '
имя1;им,я2;имя3
имя4;имя5;имя6
имя;имя;имя;имя
,имя7;имя,8;имя,9
';
$incorrectInput2 = '
имя1;имя2;имя3
имя4,имя5,имя6
';
$incorrectInput3 = '
А;ааа,ааа;а
B;bbb,bbb;b
';
$incorrectInput4 = '
имя1;имя2;имя3
имя4,имя5,имя6
имя4;имя5;имя6
';
function detectSeparator(string $str): ?string
{
$rows = preg_split('/(\r\n|\r|\n)/', trim($str));
$rowCounts = [
"\t" => [],
',' => [],
';' => [],
];
// foreach ($rows as $row) {
// foreach ($rowCounts as $symbol => &$occurs) {
// $count = substr_count($row, $symbol);
//
// if(!in_array($count, $occurs, true)) {
// $occurs[] = $count;
// }
// }
// }
foreach ($rows as $row) {
$tabsCount = substr_count($row, "\t");
if (!in_array($tabsCount, $rowCounts, true)) {
$rowCounts["\t"][] = $tabsCount;
}
$commaCount = substr_count($row, ',');
if (!in_array($commaCount, $rowCounts, true)) {
$rowCounts[','][] = $commaCount;
}
$semicolonCount = substr_count($row, ';');
if (!in_array($semicolonCount, $rowCounts, true)) {
$rowCounts[';'][] = $semicolonCount;
}
}
$rowCounts = array_filter($rowCounts, function ($occurs) {
$occursCount = count($occurs);
// Remove elements that occurs different times
if ($occursCount > 1) {
return false;
}
// Remove elements that occurs only zero times
if ($occursCount === 1 && reset($occurs) === 0) {
return false;
}
return true;
});
if (count($rowCounts) === 1) {
return array_key_first($rowCounts);
}
return null;
}
var_dump(detectSeparator($input1)); // ;
// var_dump(detectSeparator($input2)); // ,
// var_dump(detectSeparator($input3)); // ;
// var_dump(detectSeparator($incorrectInput1)); // null
// var_dump(detectSeparator($incorrectInput2)); // null
// var_dump(detectSeparator($incorrectInput3)); // null
// var_dump(detectSeparator($incorrectInput4)); // null