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