3

私は次のようなものを含むファイルを持っています:

toto;145
titi;7
tata;28

このファイルを展開して配列を作成します。そのコードでデータを表示できます:

foreach ($lines as $line_num => $line) {
    $tab = explode(";",$line);
    //erase return line
    $tab[1]=preg_replace('/[\r\n]+/', "", $tab[1]);
    echo $tab[0]; //toto //titi //tata
    echo $tab[1]; //145 //7 //28
}

$tab[0]それぞれに含まれるデータ$tab[1]が一意であることを確認したい。

たとえば、ファイルが次のような場合、「新しい例外をスロー」したい:

toto;145
titi;7
tutu;7
tata;28

または好き:

toto;145
tata;7
tata;28

どうやってやるの ?

4

6 に答える 6

2

を使用してファイルを配列にfile()変換し、追加の重複チェックを使用して連想配列に変換します。

$lines = file('file.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$tab = array();
foreach ($lines as $line) {
    list($key, $val) = explode(';', $line);
    if (array_key_exists($key, $tab) || in_array($val, $tab)) {
        // throw exception
    } else {
        $tab[$key] = $val;
    }
}
于 2012-07-03T22:54:48.510 に答える
1

簡単な方法の1つは、array_uniqueを使用して、展開後にパーツ(tab[0]とtab[1])を2つの別々の配列に保存し、たとえば$col1と$col2という名前を付けてから、次の簡単なテストを実行できます。

<?php
if (count(array_unique($col1)) != count($col1))
echo "arrays are different; not unique";
?>

重複するエントリが存在する場合、PHPは配列部分を一意に変換します。したがって、新しい配列のサイズが元の配列と異なる場合は、それが一意ではなかったことを意味します。

于 2012-07-03T22:43:45.250 に答える
1

それらをキー => 値のペアとして配列に格納し、ファイルをループしているときに、各キーまたは値が配列に既に存在するかどうかを確認します。array_key_existsで既存のキーを確認し、in_arrayで既存の値を確認できます。

于 2012-07-03T22:40:36.823 に答える
0
//contrived file contents
$file_contents = "
toto;145
titi;7
tutu;7
tata;28";

//split into lines and set up some left/right value trackers
$lines = preg_split('/\n/', trim($file_contents));
$left = $right = array();

//split each line into two parts and log left and right part
foreach($lines as $line) {
    $splitter = explode(';', preg_replace('/\r\n/', '', $line));
    array_push($left, $splitter[0]);
    array_push($right, $splitter[1]);
}

//sanitise left and right parts into just unique entries
$left = array_unique($left);
$right = array_unique($right);

//if we end up with fewer left or right entries than the number of lines, error...
if (count($left) < count($lines) || count($right) < count($lines))
    die('error');
于 2012-07-03T22:46:13.257 に答える
0

配列をトラバースしている間に、値を既存の配列、つまりプレースホルダーに追加します。これは、in_array()を介して値が存在するかどうかを確認するために使用されます。

<?php
$lines = 'toto;145 titi;7 tutu;7 tata;28';
$results = array();

foreach ($lines as $line_num => $line) {
    $tab = explode(";",$line);
    //erase return line
    $tab[1]=preg_replace('/[\r\n]+/', "", $tab[1]);

    if(!in_array($tab[0]) && !in_array($tab[1])){
        array_push($results, $tab[0], $tab[1]);
    }else{
        echo "value exists!";
        die(); // Remove/modify for different exception handling
    }

}

?>
于 2012-07-03T22:40:35.687 に答える
0

キー「toto」、「tata」などで連想配列を使用します。
キーが存在するかどうかを確認するには、array_key_existsまたはissetを使用できます。

ところで。の代わりに、 trim (またはrtrimpreg_replace('/[\r\n]+/', "", $tab[1]) )を試してください。

于 2012-07-03T22:41:28.097 に答える