- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个图片目录,它可以包含 100 到数千张图片。我需要从该目录中取出 81 张随机图像作为样本以供使用(在一个数组中)。
我目前正在使用以下工具来抓取图像
$locations = 'compressed/';
$images = glob($locations . '*', GLOB_BRACE);
$selected = $images[array_rand($images)];
此方法的问题是可能会两次获得相同的图像(尽管在大样本中很少见)
我还看到可以使用 opendir 然后对数组进行洗牌。有人可以告诉我哪个使用效率更高吗?我会假设使用 shuffle 然后抓取前 81 个元素会更好但对于更大的计数会更慢(因为洗牌大型数组需要更长的时间)。
关于与使用 opendir(或我可能不知道的其他方法)相对的我当前设置的时间复杂度的任何建议?
谢谢
最佳答案
这是一个非常好的问题,我希望能提出更多这样的问题。
$start = microtime(true);
function recursiveDirectoryIterator($path) {
foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $file) {
if(!$file->isDir()) {
yield $file->getFilename() . $file->getExtension();
}
}
}
$instance = recursiveDirectoryIterator('../vendor');
$files = [];
foreach($instance as $value) {
$files[] = $value;
}
$total_files = count($files);
$random_array = [];
$total_randoms = 81;
for(;;){
$rand = random_int(0, $total_files);
if(count($random_array) == $total_randoms) {
break;
}
if(!isset($random_array[$rand])) {
$random_array[$rand] = $files[$rand];
}
}
echo "Mem peak usage: " . (memory_get_peak_usage(true)/1024/1024)." MiB" . '<br>';
echo "Total number of files: " . $total_files . '<br>';
echo "Completed in: ", microtime(true) - $start, " seconds" . '<br>';
echo '<pre>';
print_r($final);
die;
输出
Mem peak usage: 2 MiB
Total number of files: 12972
Completed in: 0.74663186073303 seconds
Array
(
[6118] => PreDec.phpphp
[4560] => LabelMaker.phpphp
[10360] => RecursiveDirectoryIterator.phpphp
[4124] => Enum.phpphp
[2671] => ImportCommand.phpphp
[1250] => WebDriverTest.phpphp
[10518] => AutoExpireFlashBagTest.phpphp
[6805] => zsdtPackTask.phpphp
[4288] => HTML.Trusted.txttxt
[6462] => border-disable.phptphpt
[4980] => main.ymlyml
[505] => StepTested.phpphp
[5219] => xhprof.ini.j2j2
[12959] => RequestInterface.phpphp
[1423] => xd5.phpphp
[4285] => HTML.TidyAdd.txttxt
[4930] => .travis.ymlyml
[12013] => Defined.phpphp
[8779] => Markdown.phpphp
[5979] => pt.phpphp
[278] => AbstractAdapter.phpphp
[2155] => SemVerTest.phpphp
[523] => ServicesResolverFactory.phpphp
[11686] => AbstractDumper.phpphp
[7320] => Functions.phpphp
[7763] => mocked_clone.tpl.distdist
[11541] => test_landscape.gifgif
[3557] => RegionSelectorSpec.phpphp
[2600] => RoutingAccessSniff.phpphp
[9496] => LoaderTest.phpphp
[4958] => setup-RedHat.ymlyml
[3477] => api.featurefeature
[7975] => WtfCommand.phpphp
[9001] => ElseIfDeclarationSniff.phpphp
[11696] => VarDumperTestTrait.phpphp
[11211] => empty.ymlyml
[10925] => ObjectRouteLoader.phpphp
[10936] => MatcherDumperInterface.phpphp
[2685] => ConnectCommand.phpphp
[9066] => EmptyStyleDefinitionSniff.phpphp
[3536] => BehatTestExtensionInstallStorage.phpphp
[4720] => ansible-args.mdmd
[326] => ZipOutputParser.phpphp
[9565] => BufferedOutput.phpphp
[712] => CliExtension.phpphp
[3436] => .travis.ymlyml
[4471] => HTMLPurifier.kses.phpphp
[2764] => RouteSubscriberCommand.phpphp
[10633] => RoutableFragmentRenderer.phpphp
[6906] => Reference.phpphp
[11663] => DoctrineCaster.phpphp
[8042] => GitHubChecker.phpphp
[1466] => ImageDriverInterface.phpphp
[2652] => DrupalCommand.phpphp
[7265] => classUsesNamespacedFunction.phpphp
[12129] => ExtensionInterface.phpphp
[12184] => ConditionalExpression.phpphp
[12128] => EscaperExtension.phpphp
[6678] => JsHintTask.phpphp
[5351] => main.ymlyml
[2104] => _bootstrap.phpphp
[143] => deploy_branch
[1360] => x8f.phpphp
[4713] => composer-dependency.mdmd
[7495] => ExceptionInAssertPostConditionsTest.phpphp
[4508] => info.txttxt
[8369] => 6.1.3-curl-adapter.phpphp
[3093] => create-data.ymlyml
[1882] => .gitkeepgitkeep
[3747] => example.makemake
[507] => EventDispatchingBackgroundTester.phpphp
[3336] => shell.ymlyml
[397] => AnnotationReader.phpphp
[4005] => xhUnitTest.phpphp
[5168] => test.ymlyml
[10909] => MissingMandatoryParametersException.phpphp
[8686] => FacetSetTest.phpphp
[2321] => FileCache.phpphp
[10538] => StreamedResponseTest.phpphp
[12572] => in.testtest
[7031] => StringContainsToken.phpphp
)
代码分解。
我将 RecursiveDirectoryIterator 与 Generator 一起使用以节省内存使用量。
接下来,我没有洗牌一个巨大的数组,而是选择了另一种方法:在文件数组的最大计数和 0 范围内生成 81 个随机的、不重复的数字。一旦你有了随机数,只需使用 array_intersect_key,它相当快.
请注意一个我没有考虑到的逻辑陷阱:
for
循环将一直运行。最后说明:我绝对相信比我聪明的人可以想出更好的办法,但现在这行得通。
此外,由于我使用的是 PHP 7.x,因此我拥有 opcache 的优势,并且对我而言性能会更好,您的结果可能会有所不同。
请注意,如果文件数量非常少,for
循环将运行更长时间,因为较小样本的碰撞变化更大。
关于PHP OpenDir 与 array_rand,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46649055/
我在 JavaScript 文件中运行 PHP,例如...... var = '';). 我需要使用 JavaScript 来扫描字符串中的 PHP 定界符(打开和关闭 PHP 的 )。 我已经知道使
我希望能够做这样的事情: php --determine-oldest-supported-php-version test.php 并得到这个输出: 7.2 也就是说,php 二进制检查 test.
我正在开发一个目前不使用任何框架的大型 php 站点。我的大问题是,随着时间的推移慢慢尝试将框架融入应用程序是否可取,例如在创建的新部件和更新的旧部件中? 比如所有的页面都是直接通过url服务的,有几
下面是我的源代码,我想在同一页面顶部的另一个 php 脚本中使用位于底部 php 脚本的变量 $r1。我需要一个简单的解决方案来解决这个问题。我想在代码中存在的更新查询中使用该变量。 $name)
我正在制作一个网站,根据不同的情况进行大量 PHP 重定向。就像这样...... header("Location: somesite.com/redirectedpage.php"); 为了安全起见
我有一个旧网站,我的 php 标签从 因为短标签已经显示出安全问题,并且在未来的版本中将不被支持。 关于php - 如何避免在 php 文件中写入
我有一个用 PHP 编写的配置文件,如下所示, 所以我想用PHP开发一个接口(interface),它可以编辑文件值,如$WEBPATH , $ACCOUNTPATH和 const值(value)观
我试图制作一个登录页面来学习基本的PHP,首先我希望我的独立PHP文件存储HTML文件的输入(带有表单),但是当我按下按钮时(触发POST到PHP脚本) )我一直收到令人不愉快的错误。 我已经搜索了S
我正在寻找一种让 PHP 以一种形式打印任意数组的方法,我可以将该数组作为赋值包含在我的(测试)代码中。 print_r 产生例如: Array ( [0] => qsr-part:1285 [1]
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: What is the max key size for an array in PHP? 正如标题所说,我想知道
我正在寻找一种让 PHP 以一种形式打印任意数组的方法,我可以将该数组作为赋值包含在我的(测试)代码中。 print_r 产生例如: Array ( [0] => qsr-part:1285 [1]
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我在 MySQL 数据库中有一个表,其中存储餐厅在每个工作日和时段提供的菜单。 表结构如下: i_type i_name i_cost i_day i_start i_
我有两页。 test1.php 和 test2.php。 我想做的就是在 test1.php 上点击提交,并将 test2.php 显示在 div 中。这实际上工作正常,但我需要向 test2.php
我得到了这个代码。我想通过textarea更新mysql。我在textarea中回显我的MySQL,但我不知道如何更新它,我应该把所有东西都放进去吗,因为_GET模式没有给我任何东西,我也尝试_GET
首先,我是 php 的新手,所以我仍在努力学习。我在 Wordpress 上创建了一个表单,我想将值插入一个表(data_test 表,我已经管理了),然后从 data_test 表中获取所有列(id
我有以下函数可以清理用户或网址的输入: function SanitizeString($var) { $var=stripslashes($var); $va
我有一个 html 页面,它使用 php 文件查询数据库,然后让用户登录,否则拒绝访问。我遇到的问题是它只是重定向到 php 文件的 url,并且从不对发生的事情提供反馈。这是我第一次使用 html、
我有一个页面充满了指向 pdf 的链接,我想跟踪哪些链接被单击。我以为我可以做如下的事情,但遇到了问题: query($sql); if($result){
我正在使用 从外部文本文件加载 HTML/PHP 代码 $f = fopen($filename, "r"); while ($line = fgets($f, 4096)) { print $l
我是一名优秀的程序员,十分优秀!