0

PHPでCSVを読み込んで実験しています。

3 列の単純な値を持つ CSV ファイルがあります。

各行をループして各値を出力することができましたが、一意の値と行内の特定の位置に基づいて条件付きでデータを取得する必要があります。

たとえば、列 a の一意の値ごとに、列 c を値の 1 つの条件として使用して、列 b の値に基づいてデータ オブジェクトの配列を生成する必要があります。

私のCSV:

1   123 0
1   124 0
1   125 0
1   126 0
1   127 0
1   128 0
1   129 0
1   130 1
1   131 1
1   132 1
1   133 1
1   134 1
1   135 1
2   123 0
2   124 0
2   125 0
2   126 1
2   127 1
2   128 1
2   129 1
2   130 1
2   131 1
2   132 1
2   133 1
2   134 1
2   135 1
3   256 0
3   456 0
3   321 0
3   489 0
3   965 0
3   652 1
3   741 1

尋問に使用しているコード:

<?php
$stack = array();
if (($han = fopen("sample.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($han, 50, ",")) !== FALSE) {
        array_push($stack, $data); //push each arr1 into arr2(stack)
    }
    fclose($han);
}
sort($stack); //sort arr2
$newarray = array();
foreach($stack as $val){
$lineid = $val[0];
$segmentid = $val[1];
$action = $val[2];
$newarray[$lineid][$segmentid] = $action;
}
print_r($newarray);
?>

出力

Array
(
    [1] => Array
        (
            [123] => 0
            [124] => 0
            [125] => 0
            [126] => 0
            [127] => 0
            [128] => 0
            [129] => 0
            [130] => 1
            [131] => 1
            [132] => 1
            [133] => 1
            [134] => 1
            [135] => 1
        )

    [2] => Array
        (
            [123] => 0
            [124] => 0
            [125] => 0
            [126] => 1
            [127] => 1
            [128] => 1
            [129] => 1
            [130] => 1
            [131] => 1
            [132] => 1
            [133] => 1
            [134] => 1
            [135] => 1
        )

    [3] => Array
        (
            [256] => 0
            [321] => 0
            [456] => 0
            [489] => 0
            [652] => 1
            [741] => 1
            [965] => 0
        )

)

私が達成したいことの疑似コード

for each unique column_a value {
grab all column_b's within this unique column_a and for each
    $column_b_object = new stdClass;
    $column_b_object->id = $column_b_value;
      if (column_c_value = "0") {
        $column_b_object->zero = "no";
      }
    $column_bs[] = $column_b_object;
    execute something, reset, move to next unique column_a
}

編集ソリューション:

<?php
$stack = array();
if (($han = fopen("sample.csv", "r")) !== FALSE) {
while (($data = fgetcsv($han, 50, ",")) !== FALSE) {
array_push($stack, $data); //push each arr1 into arr2(stack)
}
fclose($han);
}
sort($stack); //sort arr2
$newarray = array();
foreach($stack as $val){
$lineid = $val[0]; $segmentid = $val[1]; $action = $val[2];
$newarray[$lineid][$segmentid] = $action;
}
foreach($newarray as $value) {
foreach($value as $key => $value2){
echo $key . " | " . $value2 . "<br />";
}
echo "STOP";
}
?>

それが理にかなっていることを願っています。

ありがとう

4

1 に答える 1

1

ループ ロジックに問題があります。すべての「b」要素を繰り返し処理する場合、「a」要素の一意性を定義する必要があるのはなぜですか? とにかく、それは私だけかもしれませんが、あなたの擬似的な方法でそれをやりたい場合は、次のことができます:最初の要素(要素a)の変更を追跡します

$i=0;
$stack = array();
if (($han = fopen("3col.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($han, 50, ",")) !== FALSE) {
        array_push($stack, $data); //push each arr1 into arr2(stack)
        $i++;
        $num = count($data);
        echo "<p>";
        for ($c=0; $c < $num; $c++) {
            echo $data[$c] . "|";
        }
        echo "</p>";
    }
    fclose($han);
}

sort($stack); //sort arr2

foreach($stack as $key => $arr2){
    $sameA = ($arr2[0] == $a) ? "" : "-->";
        echo $sameA;

    foreach($arr2 as $key => $val){ 
        echo $val." ";
    }
        $a = $arr2[0];
        echo "<br/>";
}

および出力:

-->1 | 123 | 0 | 
1 | 124 | 0 | 
1 | 125 | 0 | 
1 | 126 | 0 | 
1 | 127 | 0 | 
1 | 128 | 0 | 
1 | 129 | 0 | 
1 | 130 | 1 | 
1 | 131 | 1 | 
1 | 132 | 1 | 
1 | 133 | 1 | 
1 | 134 | 1 | 
1 | 135 | 1 | 
-->2 | 123 | 0 | 
2 | 124 | 0 | 
2 | 125 | 0 | 
2 | 126 | 1 | 
2 | 127 | 1 | 
2 | 128 | 1 | 
2 | 129 | 1 | 
2 | 130 | 1 | 
2 | 131 | 1 | 
2 | 132 | 1 | 
2 | 133 | 1 | 
2 | 134 | 1 | 
2 | 135 | 1 | 
-->3 | 256 | 0 | 
3 | 321 | 0 | 
3 | 456 | 0 | 
3 | 489 | 0 | 
3 | 652 | 1 | 
3 | 741 | 1 | 
3 | 965 | 0 | 

新しい「a」要素を開始するたびに矢印が表示されます

于 2011-06-06T17:50:42.303 に答える