嗨,我正在运行以下代码。
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模型。