【问题标题】:PHP array with keys as file's creation date以键为文件创建日期的 PHP 数组
【发布时间】:2016-04-12 22:37:02
【问题描述】:

所以我有一个文件夹path/to/folder,文件夹内有文件夹,文件夹内有文件,等等——都在一个文件夹内path/to/folder。我想在这个文件夹path/to/folder 中存储所有图像的所有名称(.gif、.png、.jpg、.jpeg 等)(我的尝试):

$arr = glob("path/to/folder/*.jpg");//not sure how to specify or "|" here

我还需要与图像元数据相关的日期(创建日期),如下所示(请参阅下面的伪代码):

foreach($arr as $a){
    $date_of_a = function_getting_dates_of_a($a);//filectime?
    $newArr[$date_of_a]=function_getting_names_of_a($a);//names are filtered by a pattern
                      //^^^^^^^^^^^^^^^^^^^^^^^^^^^I've already created this.
}

这样我可以有相同名称的 values 和不同的 keys,这将是日期,因此两个同名和相同日期对(或元组取决于有多少重复)将浓缩为一个唯一的名称日期项目。例如,

2016-01-01 => path/to/folder/.../name1.jpg//*duplicate name-date pair
2016-01-02 => path/to/folder/.../name2.jpg
2016-01-01 => path/to/folder/.../name1.jpg//*duplicate name-date pair
2016-01-02 => path/to/folder/.../name1.jpg

将数组减少到

2016-01-01 => path/to/folder/.../name1.jpg//*only one now
2016-01-02 => path/to/folder/.../name2.jpg
2016-01-02 => path/to/folder/.../name1.jpg

这里,/.../ 的意思是“path/to/folder 中的任意数量的文件夹”。我正在处理的数据意味着2016-01-01 => path/to/folder/.../name1.jpg2016-01-02 => path/to/folder/.../name1.jpg 是在不同时间制作的两个相同对象。最后,我希望能够使用array_count_values 计算每个名称的实例数。


尝试

<?php

    $myArray = glob("path/to/folder/*.jpg");
    foreach($myArray as $item){
        $date = filectime($item);//What if no date? Is that possible?
        if(preg_match('/PATTERN/',$item,$match)==1){
            $newArr[$date]=current($match);
        }
    }
    array_count_values($newArr);
    <!-- CODE TO GRAPH ITEMS BY FREQUENCY-->
?>

【问题讨论】:

  • 您有尝试解决方案的示例代码吗?
  • 两个相同的对象怎么会有不同的日期?从你写的来看,路径是一样的?
  • 文件可以有相同的日期,可以是不同的文件名,也可以在不同的目录中相同。
  • @Eric,你是对的,路径可能不同;但是,function_getting_names_of_a 将匹配特定命名图像的模式,因此不会考虑文件路径。我已经写了function_getting_names_of_a,但是这里排除了。
  • @Eric,我所说的“相同对象”是指数据所代表的内容和业务行为。在另一个日期拍摄的同名图像代表两个独特的“对象”;例如,banana 是一个名字,你可以有两个香蕉,这样它们就被认为是“相同的”,因为它们是香蕉。这有意义吗?

标签: php sorting date glob


【解决方案1】:

以下代码应该创建一个日期时间键数组:

<?php

$myArray = glob("/*.jpg");
$newArr = array();
foreach($myArray as $item){
    $timestamp = filectime($item);
    if ($timestamp === false) {
        continue;
    }
    $date = new \DateTime();
    $date->setTimestamp($timestamp);
    $formattedDate = $date->format('m-d-Y');
    $newArr[$formattedDate]=$item;
}
array_count_values($newArr);
echo "<pre>";
print_r($newArr);
//<!-- CODE TO GRAPH ITEMS BY FREQUENCY-->

这是当我在同一天创建多个 JPG 文件时打印出来的:

Array
(
    [04-12-2016] => sdfdsf.jpg
)

至于递归查找文件,你可以试试这些功能,我在自己的个人项目中使用过:

function findDirectories($rootPath) {
    $directories = array();
    foreach (glob($rootPath . "/*", GLOB_ONLYDIR) as $directory) {
        $directories[] = $directory;
    }
    return $directories;
}

function findFiles($rootPath, $extension) {
    $files = array();
    foreach (glob($rootPath . "/*.$extension") as $file) {
        $files[] = $file;
    }
    return $files;
}

function findFilesRecursive($rootPath,$extension) {
    $files = findFiles($rootPath,$extension);
    $directories = findDirectories($rootPath);
    if (!empty($directories)) {
        foreach ($directories as $key=>$directory) {
            $foundFiles = findFilesRecursive($directory,$extension);
            foreach ($foundFiles as $foundFile) {
                $files[] = $foundFile;
            }
        }
    }
    return $files;
}

【讨论】:

  • findFilesRecursive($directory); 应该是findFilesRecursive($directory,'jpg'); 您的个人项目功能运行良好。谢谢。
  • 感谢您的反馈,我修正了答案。很高兴能帮上忙!
猜你喜欢
  • 1970-01-01
  • 2017-11-03
  • 2011-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
相关资源
最近更新 更多