循环遍历数组并比较时间戳


Loop through arrays and compare timestamps

我有两个数组,我喜欢循环遍历它们,并比较每个数组之间的日期。

$newArray = Array (
    [0] => Array (
            [id] => 1
            [date] => 26-11-2013 9:30:56 PM
        )
    [1] => Array (
            [id] => 2
            [date] => 30-11-2013 11:20:12 AM
        )
    [2] => Array (
            [id] => 3
            [date] => 26-11-2013 9:30:56 PM
        )
    [3] => Array (
            [id] => 4
            [date] => 30-11-2013 11:20:12 AM
        )
}
$oldArray = Array (
    [0] => Array (
            [id] => 1
            [date] => 26-11-2013 9:30:56 PM
        )
    [1] => Array (
            [id] => 2
            [date] => 26-11-2013 9:30:56 PM
        )
    [2] => Array (
            [id] => 3
            [date] => 26-11-2013 9:30:56 PM
        )
}
foreach ($newArray as $newPhoto) {
    foreach ($oldArray as $oldPhoto) {
        if (strtotime($newPhoto['date']) != strtotime($oldPhoto['date'])) {
            // download new photo
        }
    }
}

我意识到把foreachforeach放在一起不会减少它。循环遍历每个数组并比较日期的最佳方法是什么?

$newArray具有最新照片,并与$oldArray进行比较。如果时间戳不匹配或列表中有新照片,请下载新图像。

在这个例子中,我将下载第二个和第四个图像,而忽略其他图像。

我会这样做。它不对任何一个数组的索引进行任何假设,并且随着$oldArray的大小增长,它仍然相当有效。

// index $oldArray by id for speed
$index = array();
foreach ($oldArray as $photo) {
    $index[$photo['id']] = $photo['date'];
}
// iterate through new photos, checking if each one needs downloading
foreach ($newArray as $photo) {
    if (!isset($index[$photo['id']]) // photo is not in $oldArray
            || strtotime($photo['date']) > strtotime($index[$photo['id']])) { // photo is in $oldArray, but a new version is available
        // download new photo
    }
}
foreach ($newArray as $key => $newPhoto) {
    //If the key doesn't exist in $oldArray it is new
    if(!isset($oldArray[$key])){
      //download new photo
    }
    elseif (strtotime($newPhoto['date']) != strtotime($oldArray[$key]['date'])) { //timestamp mismatch
      //download new photo
    }
}

注意:我假设您的oldArray和newArray键控相同。I.e如果id 1在newArray的0点中,我假设id 1在oldArray的0点中。

为什么使用foreach,您可以简单地使用for:

for($i=0; $i<sizeof($newArray); $i++){
    if(strtotime($newArray[$i]['date']) != strtotime($oldArray[$i]['date'])){
        //new photo do sth
    }else {
        //old photo do sth or not :)
    }
}