0

一意の値のみを出力しようとしています。から巨大なオブジェクト配列を受け取っているので、PHPのArrayObjectクラスを使用して反復しようとしています

$arrayobject = new ArrayObject($data);

$iterator = $arrayobject->getIterator();

while($iterator->valid()){
    echo $iterator->current()->USERID. " : " .$iterator->current()->SUBCATID."<br/>";
    $iterator->next();
}

これが現在の結果です

201087 : 1
201146 : 1
201087 : 3
201087 : 2

ご覧のとおり、最初のデータには他に 2 つの重複があり、また、最初と 2 番目のデータには同様の subcatid があります。目的は、一意のユーザー ID と subcatid のみを出力することです。そのサンプル コードを考えると、これらの重複データをスキップする方法私の出発点として?

4

2 に答える 2

1

質問を理解
できるかどうかはわかりませんが、多分....配列を並べ替えて現在のユーザーIDを記憶し、スクリプトが別のIDに到達するまで重複をスキップできるようにすることができます。

<?php
$data = data();
usort(
    $data,
    function($a,$b) {
        return strnatcmp($a->USERID, $b->USERID);
    }
);
$current = null;
foreach( $data as $e ) {
    if ( $current!=$e->USERID ) {
        $current = $e->USERID;
        echo $e->USERID, ' ', $e->SUBCATID, "\n";
    }
}   


function data() {

    $x = array(
        array(201087,1),
        array(201146,1),
        array(201087,3),
        array(201087,2),
        array(222222,3)
    );
    foreach($x as $y) {
        $o = new StdClass;
        $o->USERID = $y[0];
        $o->SUBCATID = $y[1];
        $data[] = $o;
    }
    return $data;
}

または、スクリプトは、ハッシュマップ/配列など、以前に処理されたすべてのIDを記憶します

<?php
$data = data();

$processed = array();
foreach( $data as $e ) {
    if ( !isset($processed[$e->USERID]) ) {
        $processed[$e->USERID] = true;
        echo $e->USERID, ' ', $e->SUBCATID, "\n";
    }
}   


function data() {

    $x = array(
        array(201087,1),
        array(201146,1),
        array(201087,3),
        array(201087,2),
        array(222222,3)
    );
    foreach($x as $y) {
        $o = new StdClass;
        $o->USERID = $y[0];
        $o->SUBCATID = $y[1];
        $data[] = $o;
    }
    return $data;
}

両方のスクリプトが印刷されます

201087 1
201146 1
222222 3
于 2012-11-12T08:59:16.550 に答える
-1
$ids = array(1,2,3,4,4);
$ids = array_unique($ids); // remove duplicates
于 2012-11-12T08:25:45.167 に答える