您好我正在运行以下代码。
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
有人可以帮助我吗
由于
答案 0 :(得分:4)
array_unique
将是正确的选择。只需将爆炸的数组传递给此函数,您就可以得到所需的信息。
答案 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。