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

我只希望它返回一个唯一的名称,如下所示

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 回答