PHP OpenDir与array_rand

PHP OpenDir与array_rand,php,time-complexity,Php,Time Complexity,我有一个图像目录,可以包含100到数千个图像。我需要从这个目录中抽取81个随机图像样本(在一个数组中)来使用 我目前正在使用以下内容来抓取图像 $locations = 'compressed/'; $images = glob($locations . '*', GLOB_BRACE); $selected = $images[array_rand($images)]; 这种方法的问题是,可能两次获得相同的图像(尽管在大样本中很少) 我还看到opendir可以用来洗牌数组。谁能告诉我哪一个更

我有一个图像目录,可以包含100到数千个图像。我需要从这个目录中抽取81个随机图像样本(在一个数组中)来使用

我目前正在使用以下内容来抓取图像

$locations = 'compressed/';
$images = glob($locations . '*', GLOB_BRACE);
$selected = $images[array_rand($images)];
这种方法的问题是,可能两次获得相同的图像(尽管在大样本中很少)

我还看到opendir可以用来洗牌数组。谁能告诉我哪一个更有效?我假设使用洗牌,然后抓取前81个元素会更好,但对于更大的计数会更慢(因为洗牌大数组需要更长的时间)

与使用opendir(或其他我可能不知道的方法)相比,对我当前设置的时间复杂性有何建议


谢谢

这是一个非常好的问题,我希望能提出更多的问题



代码崩溃

为了节省内存使用量,我使用了

接下来,我选择了另一种方法,而不是洗牌一个巨大的数组:在文件数组的最大计数和0的范围内生成81个随机的、不重复的数字。一旦你有了随机数,简单地使用它是相当快的

请注意我没有考虑的一个逻辑陷阱:

  • 如果文件总数少于81,则的
    循环将永远运行


最后一点:我绝对相信比我聪明的人能想出更好的办法,但现在这个办法行得通

另外,由于我使用的是PHP7.x,所以我有它的优势,性能也会更好,您的结果可能会有所不同


请注意,如果文件的数量非常少,那么
for
循环将运行更长的时间,因为较小样本上的冲突更改更高。

为什么不测试并计时?@abracadver因为我不想将数千张图像上传到我的服务器来测试它,如果我没有在本地测试它,可以给你一个好的提示。至少,如果您使用操作系统和相同的文件系统。顺便提一句好问题。@Andrew谢谢你,我认为数字生成器绝对是一种更好的方法,很高兴你有文件系统来测试它。幸运的是,就我的应用程序而言,目录中的文件永远不会少于81个,因此警告(inf.for循环)并不重要:)@Andrew array\u intersect\u key在PHP5.3中的工作方式是否不同?我将random_int切换为rand,但$final始终是完全相同的文件(random_数组不同,因此它不能获取散列或类似的内容)噢,你完全正确。我的坏,是在匆忙中没有真的认为这一点通过。我已经编辑了这个问题。您可以在for循环中添加文件,而不是组合数组。检查数组键是否存在,如果它没有添加它,就这样。如果需要按顺序排列键,请在
$random\u array
上执行
array\u values
,ti将对其重新排序。因为它只有81个元素,所以性能不会有问题。
$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
)