仅使用explode显示返回数组的一个实例

时间:2012-05-17 09:37:48

标签: php explode

您好我正在运行以下代码。

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

有人可以帮助我吗

由于

3 个答案:

答案 0 :(得分:4)

array_unique将是正确的选择。只需将爆炸的数组传递给此函数,您就可以得到所需的信息。

你可以在这里查看:http://php.net/manual/en/function.array-unique.php

答案 1 :(得分: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数组的人可能会觉得它更容易阅读。

答案 2 :(得分:2)

foreach ($response as $object) {
    $basename = basename($object);
    $structure = explode("/", $object); 
    echo $structure[0] . '<br>';
    ...
}

如果您想要避免重复发出$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 Model