使用爆炸仅显示返回数组中的一个实例


Only show one instance off return array using 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

有人可以帮我解决这个问题吗

谢谢

array_unique将是正确的选择。只需将松散数组传递给此函数,您就会得到所需的内容。

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

您将

通过使用该值作为数组键获得最佳性能:

$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数组的人可能会发现它更容易阅读。

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模型。