0

こんにちは、次のコードを実行しています。

foreach ($response as $object) {

$basename = basename($object);

$structure = explode("/", $object);

echo $structure[0] . '<br>';


}

これは以下を返します。

MINOFSOUDUB412
MINOFSOUDUB412
MINOFSOUDUB412
MotionTracker.zip
MotionTracker
MotionTracker
MotionTracker
MotionTracker
MotionTracker
MotionTracker
MotionTracker
MotionTracker
MotionTracker
MotionTracker
MotionTracker
MotionTracker
MotionTracker
MotionTracker
MotionTracker

以下のような一意の名前を1つだけ返したい

MINOFSOUDUB412
MotionTracker.zip
MotionTracker

誰かがこれを手伝ってくれますか

ありがとう

4

3 に答える 3

4

array_unique正しい選択でしょう。展開された配列をこの関数に渡すだけで、必要なものが得られます。

ここで見ることができます:http://php.net/manual/en/function.array-unique.php

于 2012-05-17T09:44:52.760 に答える
2

値を配列キーとして使用すると、最高のパフォーマンスが得られます。

$unique = array();
while (...) {
    $unique[$name] = true;
}
print_r(array_keys($unique);

これは最初は少しクレイジーに思えます。結局のところ、なぜ文字列を配列キーとして使用するのでしょうか?

まあ:$unique[$name]は O(1) (配列がどれほど大きくても同じ時間がかかることを意味します) であるのに対し、 in_array($name, $unique) は O(n) であり、配列内のエントリの数に応じて増加することを意味します.

参考までに、コード内の完全なバージョンは次のようになります。

$unique = array();

foreach ($response as $object) {
    $basename = basename($object);
    $structure = explode("/", $object);
    $unique[$structure[0]] = true;
    //You could also do: $unique[$structure[0]] = $structure[0];
    //Then your second foreach could be:
    //foreach ($unique as $name)
}

foreach ($unique as $name => $fake) { echo $name . '<br>'; }

O(n) (遅いバージョン) は次のようになります。

$unique = array();
foreach ($response as $object) {
    $basename = basename($object);
    $structure = explode("/", $object);
    if (!in_array($structure[0], $unique)) {
        $unique[] = $structure[0];
    }
}

遅いバージョンの方が遅くなりますが、PHP 配列に詳しくない人には少し読みやすいかもしれません。

于 2012-05-17T09:41:33.600 に答える
2
foreach ($response as $object) {
    $basename = basename($object);
    $structure = explode("/", $object); 
    echo $structure[0] . '<br>';
    ...
}

echo'ing out での重複を防ぎたい場合は$structure[0]、履歴を保持するなどして、すでに重複しているかどうかを確認する必要があります。

$history = array();
foreach ($response as $object) {
    $name = strstr($object, "/", true);
    if ($name !== false && !isset($history[$name])) {
        $history[$name] = 1;
        echo $name . '<br>';
    }
    ...
}

おそらく、コードを合理化したいでしょう。確認してみましょう:

foreach ($response as $object) {

    $basename = basename($object);

    $structure = explode("/", $object);

    echo $structure[0] . '<br>';


}

ライン$basename = basename($object);は使用しません。削除できます:

foreach ($response as $object) {

    $structure = explode("/", $object);

    echo $structure[0] . '<br>';

}

"/"次に、最初のまでの文字列の一部のみが必要です。strstr関数はそのために便利です。

foreach ($response as $object) {

    $part = strstr($object, "/", true);
    FALSE === $part && $part = $object;

    echo $part . '<br>';

}

すでに単純化したので、単純なマッピング関数を作成できます。

$map = function($v) {
    $k = strstr($v, "/", true);
    FALSE === $k && $k = $v;
    return $k;
};

をマップします$response:

$mapped = array_map($map, $response);

そしてそれを一意にします:

$unique = array_unique($mapped);

そして、仕事は終わりました。コードははるかに読みやすくなっています。

$map = function($v) {
    $k = strstr($v, "/", true);
    FALSE === $k && $k = $v;
    return $k;
};

$mapped = array_map($map, $response);

$unique = array_unique($mapped);

foreach ($unique as $name) {
    echo $name, "<br>\n";
}

追加の利点はここにあります。出力を気にかけた瞬間に、出力されるデータはすでに整然としており、適切に利用できます。出力自体はアプリケーションの一部としてカウントされるため、データ処理と混合しないでください。IPO モデルを参照してください。

于 2012-05-17T10:15:04.277 に答える