trying to change tag Year
-
- User
- Posts:8
- Joined:Tue Mar 31, 2015 5:01 am
- Are you a spambot?:no
hi!
i'm quite a newbie and even worst, french !
i'm trying to change the year of mp3 file with getID3.
my problem :
i'm using 'COLLECTORZ' to manage my mp3 files.
COLLECTORZ is very fine but use customized tags (Tempo, Preference. Mood, ect...)
these customized tags are not properly written by getID3.
So, when i'm rewriting the mp3 with just a new year these tags are lost.
Is there some functions to just change a little little tag ?
say yes, please !!!!
thanks !
i'm quite a newbie and even worst, french !
i'm trying to change the year of mp3 file with getID3.
my problem :
i'm using 'COLLECTORZ' to manage my mp3 files.
COLLECTORZ is very fine but use customized tags (Tempo, Preference. Mood, ect...)
these customized tags are not properly written by getID3.
So, when i'm rewriting the mp3 with just a new year these tags are lost.
Is there some functions to just change a little little tag ?
say yes, please !!!!
thanks !
-
- getID3() v1 developer
- Posts:1477
- Joined:Fri May 04, 2001 4:00 pm
- Are you a spambot?:no
- Location:Northern Ontario, Canada
- Contact:
Re: trying to change tag Year
Et quand même votre anglais est bien mieux que mon français :)
Assuming you mean ID3v2, note this option and comment in write.id3v2.php:
You would need to set this option when creating the tag writer object:
Assuming you mean ID3v2, note this option and comment in write.id3v2.php:
By default it removes the existing tag and only writes the data you pass to it. If you set the merge_existing_data option to TRUE then it will try to merge the new data you pass (e.g. year) into the existing tag.$merge_existing_data = false; // if true, merge new data with existing tags; if false, delete old tag data and only write new tags
You would need to set this option when creating the tag writer object:
Code: Select all
$tagwriter = new getid3_writetags;
$tagwriter->filename = $Filename;
$tagwriter->tagformats = array('id3v2.3');
$tagwriter-> merge_existing_data = true;
... etc ...
-
- User
- Posts:8
- Joined:Tue Mar 31, 2015 5:01 am
- Are you a spambot?:no
Re: trying to change tag Year
thanks James !
i tried your suggestion before have post my question...
with no result, because some no fixed bug with
merge_existing_data
&&
overwrite_tags (in writer)
and a throw catch these option...
and if i try to pass out further i have some missing parameters and the prog bugs...!
i tried your suggestion before have post my question...
with no result, because some no fixed bug with
merge_existing_data
&&
overwrite_tags (in writer)
and a throw catch these option...
and if i try to pass out further i have some missing parameters and the prog bugs...!
-
- getID3() v1 developer
- Posts:1477
- Joined:Fri May 04, 2001 4:00 pm
- Are you a spambot?:no
- Location:Northern Ontario, Canada
- Contact:
Re: trying to change tag Year
Did you get an error message? If so, what was it exactly?
-
- User
- Posts:8
- Joined:Tue Mar 31, 2015 5:01 am
- Are you a spambot?:no
Re: trying to change tag Year
i get this :
Notice: Array to string conversion in getid3\write.id3v2.php on line 1836
Notice: Array to string conversion in getid3\write.id3v2.php on line 1836
-
- getID3() v1 developer
- Posts:1477
- Joined:Fri May 04, 2001 4:00 pm
- Are you a spambot?:no
- Location:Northern Ontario, Canada
- Contact:
Re: trying to change tag Year
You can't be using the current version because there's nothing on line 1836.
Please download the latest version and let me know if you still have any problems, and if so what the exact error message is.
Please download the latest version and let me know if you still have any problems, and if so what the exact error message is.
-
- User
- Posts:8
- Joined:Tue Mar 31, 2015 5:01 am
- Are you a spambot?:no
Re: trying to change tag Year
oh, thanks for this version i got mine (2014 build) in SourceForge.
Notice: Array to string conversion in C:\Ma musique\____php\getid3\write.id3v2.php on line 1829
line 1829 is into the merge function :
1829: $new_array = array_reverse(array_unique(array_reverse(array_merge($arr1, $arr2))));
where $arr1 is the old array and $arr2 the new tags.
Notice: Array to string conversion in C:\Ma musique\____php\getid3\write.id3v2.php on line 1829
line 1829 is into the merge function :
1829: $new_array = array_reverse(array_unique(array_reverse(array_merge($arr1, $arr2))));
where $arr1 is the old array and $arr2 the new tags.
-
- getID3() v1 developer
- Posts:1477
- Joined:Fri May 04, 2001 4:00 pm
- Are you a spambot?:no
- Location:Northern Ontario, Canada
- Contact:
Re: trying to change tag Year
Can you perhaps try and debug what's being passed there? Just before that line try insertingto see what is not being passed as an array, although they both should be arrays to get to that point in the code.
Code: Select all
var_dump($arr1);
var_dump($arr2);
$new_array = array_reverse(array_unique(array_reverse(array_merge($arr1, $arr2))));
-
- User
- Posts:8
- Joined:Tue Mar 31, 2015 5:01 am
- Are you a spambot?:no
Re: trying to change tag Year
old=
new=
Code: Select all
array(1) {
[0]=> array(10) {
["frame_name"]=> string(4) "TIT2"
["frame_flags_raw"]=> int(0)
["data"]=> string(3) "Why"
["datalength"]=> int(4)
["dataoffset"]=> int(10)
["framenamelong"]=> string(34) "Title/songname/content description"
["framenameshort"]=> string(5) "title"
["flags"]=> array(6) {
["TagAlterPreservation"]=> bool(false)
["FileAlterPreservation"]=> bool(false)
["ReadOnly"]=> bool(false)
["compression"]=> bool(false)
["Encryption"]=> bool(false)
["GroupingIdentity"]=> bool(false)
}
["encodingid"]=> int(0)
["encoding"]=> string(10) "ISO-8859-1"
}
}
Code: Select all
array(1) {
[0]=> array(4) {
["encodingid"]=> int(0)
["data"]=> string(3) "Why"
["description"]=> string(0) ""
["language"]=> string(3) "eng"
}
}
Notice: Array to string conversion in C:\Ma musique\____php\getid3\write.id3v2.php on line 1833
-
- getID3() v1 developer
- Posts:1477
- Joined:Fri May 04, 2001 4:00 pm
- Are you a spambot?:no
- Location:Northern Ontario, Canada
- Contact:
Re: trying to change tag Year
Can you please change that line 1829:and let me know how it works for you?
Code: Select all
//$new_array = array_reverse(array_unique(array_reverse(array_merge($arr1, $arr2))));
$new_array = array_merge($arr1, $arr2);
-
- User
- Posts:8
- Joined:Tue Mar 31, 2015 5:01 am
- Are you a spambot?:no
Re: trying to change tag Year
ok, i changed the line and now the next error is on this line
1540 foreach ($frame_rawinputdata as $irrelevantindex => $source_data_array) {
in function GenerateID3v2Tag
Warning: Invalid argument supplied for foreach() in C:\Ma musique\____php\getid3\write.id3v2.php on line 1540
Notice: Undefined variable: frame_name in C:\Ma musique\____php\getid3\write.id3v2.php on line 1541
etc...
then
WriteID3v2() failed with message(s):
Invalid Language in COMM ()
$this->GenerateID3v2FrameData() failed for "COMM"
$this->GenerateID3v2Tag() failed
i tried to upload a mp3 example but i don't see it anywhere...!
1540 foreach ($frame_rawinputdata as $irrelevantindex => $source_data_array) {
in function GenerateID3v2Tag
Warning: Invalid argument supplied for foreach() in C:\Ma musique\____php\getid3\write.id3v2.php on line 1540
Notice: Undefined variable: frame_name in C:\Ma musique\____php\getid3\write.id3v2.php on line 1541
etc...
then
WriteID3v2() failed with message(s):
Invalid Language in COMM ()
$this->GenerateID3v2FrameData() failed for "COMM"
$this->GenerateID3v2Tag() failed
i tried to upload a mp3 example but i don't see it anywhere...!
-
- getID3() v1 developer
- Posts:1477
- Joined:Fri May 04, 2001 4:00 pm
- Are you a spambot?:no
- Location:Northern Ontario, Canada
- Contact:
Re: trying to change tag Year
Can you please post the code you're using to call getID3?
-
- User
- Posts:8
- Joined:Tue Mar 31, 2015 5:01 am
- Are you a spambot?:no
Re: trying to change tag Year
Code: Select all
<?php
function trace($txt) { echo $txt."<br/>"; }
function parse_recursive_array($arr, $tabul=" ") {
foreach($arr as $k=>$val) {
if (is_array($val)) {
trace($tabul."ARRAY ".$k);
parse_recursive_array($val, $tabul.$tabul);
}
else trace($tabul.$k." -> ".$val);
}
}
trace("<br/>--------------------------CHECK post ".count($_POST));
parse_recursive_array($_POST);
function recursiveScan($dirname, $subdir="", $deep=0) {
// trace("recurs=".$dirname." subdir=".$subdir." deep=".$deep);
if ($dir = opendir($dirname)) {
while (($file = readdir($dir)) !== false) {
if ($file != "." && $file != "..") {
//$curFile = "$dirname$file";
$curFile = $dirname.$file;
if (is_dir($curFile)) {recursiveScan($curFile.'/', ($subdir=='' ? $file : $subdir.'/'.$file) , $deep++); }
else {
trace(" file=".$curFile);
// do what you actually want to do to the files here, call getID3 or whatever
}
}
}
}
}
//recursiveScan("C:Ma musique/____php/ID3TagsRW/");
$TaggingFormat = 'UTF-8';
header('Content-Type: text/html; charset='.$TaggingFormat);
echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">';
echo '<html><head><title>test getID3</title></head><style type="text/css">BODY,TD,TH { font-family: sans-serif; font-size: 9pt;" }</style><body>';
require_once('getid3.php');
// Initialize getID3 engine
$getID3 = new getID3;
$getID3->setOption(array('encoding'=>$TaggingFormat));
getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'write.php', __FILE__, true);
//$browsescriptfilename = 'demo.browse.php';
$browsescriptfilename = 'test_getid3.php';
$Filename = //(isset($_REQUEST['Filename']) ? $_REQUEST['Filename'] : '');
"C:Ma musique/____php/ID3TagsRW/music/why2.mp3";//
$target_genre = isset($_POST['Genre']) ? $_POST['Genre'] :"";
$target_genreOther = isset($_POST['GenreOther']) ? $_POST['GenreOther'] :"";
if (isset($_POST['WriteTags'])) {
if (!empty($target_genreOther)) $target_genre = "";
$TagFormatsToWrite = (isset($_POST['TagFormatsToWrite']) ? $_POST['TagFormatsToWrite'] : array());
trace("<br/>--------------------------CHECK tags format ".count($TagFormatsToWrite));
parse_recursive_array($TagFormatsToWrite);
if (!empty($TagFormatsToWrite)) {
echo 'starting to write tag(s)<BR>';
$tagwriter = new getid3_writetags;
$tagwriter->filename = $Filename;
$tagwriter->tagformats = $TagFormatsToWrite;
$tagwriter->overwrite_tags = true;
$tagwriter->tag_encoding = $TaggingFormat;
$tagwriter->merge_existing_data = true;
if (!empty($_POST['remove_other_tags'])) {
$tagwriter->remove_other_tags = true;
}
$commonkeysarray = array('Title', 'Artist', 'Album', 'Year', 'Comment','MusicMatch_Tempo');
foreach ($commonkeysarray as $key) {
if (!empty($_POST[$key])) {
$TagData[strtolower($key)][] = $_POST[$key];
}
}
trace("<br/>--------------------------CHECK tagdata ".count($TagData));
parse_recursive_array($TagData);
////////////////////
/*
trace("write genre=".$_POST['Genre']."< other=".$_POST['GenreOther']."<");
trace("2write genre=".$target_genre."< other=".$target_genreOther."<");
trace(" genre empty ? ". empty($target_genre));
trace(" other genre empty ? ". empty($target_genreOther));
*/
//trace(" av nb genres ".count($TagData['genre']));
/////////////////////
if (!empty($target_genre)) {
$TagData['genre'][] = $target_genre;
}
if (!empty($target_genreOther)) {
//array_push($TagData['genre'],$_POST['GenreOther']);
$TagData['genre'][] = $target_genreOther;
//trace ("WRITE GENRE OTHER ".$TagData['genre'][] );
//trace ("WRITE GENRE OTHER ".$target_genreOther);
//echo "test 2 ".$TagData['genre'][count($TagData['genre'])-1]."<br/>";
}
if (!empty($_POST['Track'])) {
$TagData['track'][] = $_POST['Track'].(!empty($_POST['TracksTotal']) ? '/'.$_POST['TracksTotal'] : '');
}
if (!empty($_FILES['userfile']['tmp_name'])) {
if (in_array('id3v2.4', $tagwriter->tagformats) || in_array('id3v2.3', $tagwriter->tagformats) || in_array('id3v2.2', $tagwriter->tagformats)) {
if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
ob_start();
if ($fd = fopen($_FILES['userfile']['tmp_name'], 'rb')) {
ob_end_clean();
$APICdata = fread($fd, filesize($_FILES['userfile']['tmp_name']));
fclose ($fd);
/*
list($APIC_width, $APIC_height, $APIC_imageTypeID) = GetImageSize($_FILES['userfile']['tmp_name']);
$imagetypes = array(1=>'gif', 2=>'jpeg', 3=>'png');
if (isset($imagetypes[$APIC_imageTypeID])) {
$TagData['attached_picture'][0]['data'] = $APICdata;
$TagData['attached_picture'][0]['picturetypeid'] = $_POST['APICpictureType'];
$TagData['attached_picture'][0]['description'] = $_FILES['userfile']['name'];
$TagData['attached_picture'][0]['mime'] = 'image/'.$imagetypes[$APIC_imageTypeID];
} else {
echo '<b>invalid image format (only GIF, JPEG, PNG)</b><br>';
}*/
} else {
$errormessage = ob_get_contents();
ob_end_clean();
echo '<b>cannot open '.$_FILES['userfile']['tmp_name'].'</b><br>';
}
} else {
echo '<b>!is_uploaded_file('.$_FILES['userfile']['tmp_name'].')</b><br>';
}
} else {
echo '<b>WARNING:</b> Can only embed images for ID3v2<br>';
}
}
trace("<br/>---------------------CHECK TAGS To WRITE ".count($TagData));
parse_recursive_array($TagData);
$tagwriter->tag_data = $TagData;
if ($tagwriter->WriteTags()) {
echo 'Successfully wrote tags<BR>';
if (!empty($tagwriter->warnings)) {
echo 'There were some warnings:<BLOCKQUOTE STYLE="background-color:#FFCC33; padding: 10px;">'.implode('<br><br>', $tagwriter->warnings).'</BLOCKQUOTE>';
}
} else {
echo 'Failed to write tags!<BLOCKQUOTE STYLE="background-color:#FF9999; padding: 10px;">'.implode('<br><br>', $tagwriter->errors).'</BLOCKQUOTE>';
}
} else {
echo 'WARNING: no tag formats selected for writing - nothing written';
}
echo '<HR>';
}
echo '<div style="font-size: 1.2em; font-weight: bold;">Sample tag editor/writer</div>';
echo '<a href="'.htmlentities($browsescriptfilename.'?listdirectory='.rawurlencode(realpath(dirname($Filename))), ENT_QUOTES).'">Browse current directory</a><br>';
if (!empty($Filename)) {
echo '<a href="'.htmlentities($_SERVER['PHP_SELF'], ENT_QUOTES).'">Start Over</a><br><br>';
echo '<form action="'.htmlentities($_SERVER['PHP_SELF'], ENT_QUOTES).'" method="post" enctype="multipart/form-data">';
echo '<table border="3" cellspacing="0" cellpadding="4">';
echo '<tr><th align="right">Filename:</th><td><input type="hidden" name="Filename" value="'.htmlentities($Filename, ENT_QUOTES).'"><a href="'.htmlentities($browsescriptfilename.'?filename='.rawurlencode($Filename), ENT_QUOTES).'" target="_blank">'.$Filename.'</a></td></tr>';
if (file_exists($Filename)) {
// Initialize getID3 engine
$getID3 = new getID3;
$OldThisFileInfo = $getID3->analyze($Filename);
trace("<br/>--------------------------CHECK INFOS MP3 ".count($OldThisFileInfo));
parse_recursive_array($OldThisFileInfo);
getid3_lib::CopyTagsToComments($OldThisFileInfo);
trace("file=".$Filename);
trace("title=".$getID3->get_title());
trace("artist=".$getID3->get_artist());
trace("genre=".$getID3->get_genre());
trace("year=".$getID3->get_year());
trace("tempo=".$getID3->get_tempo());
trace("situation=".$getID3->get_situation());
trace("mood=".$getID3->get_mood());
trace("preference=".$getID3->get_preference());
switch ($OldThisFileInfo['fileformat']) {
case 'mp3':
case 'mp2':
case 'mp1':
$ValidTagTypes = array('id3v1', 'id3v2.3', 'ape');
break;
case 'mpc':
$ValidTagTypes = array('ape');
break;
case 'ogg':
if (!empty($OldThisFileInfo['audio']['dataformat']) && ($OldThisFileInfo['audio']['dataformat'] == 'flac')) {
//$ValidTagTypes = array('metaflac');
// metaflac doesn't (yet) work with OggFLAC files
$ValidTagTypes = array();
} else {
$ValidTagTypes = array('vorbiscomment');
}
break;
case 'flac':
$ValidTagTypes = array('metaflac');
break;
case 'real':
$ValidTagTypes = array('real');
break;
default:
$ValidTagTypes = array();
break;
}
echo '<tr><td align="right"><b>Title</b></td> <td><input type="text" size="40" name="Title" value="'.htmlentities((!empty($OldThisFileInfo['comments']['title']) ? implode(', ', $OldThisFileInfo['comments']['title'] ) : ''), ENT_QUOTES).'"></td></tr>';
echo '<tr><td align="right"><b>Artist</b></td><td><input type="text" size="40" name="Artist" value="'.htmlentities((!empty($OldThisFileInfo['comments']['artist']) ? implode(', ', $OldThisFileInfo['comments']['artist']) : ''), ENT_QUOTES).'"></td></tr>';
echo '<tr><td align="right"><b>Album</b></td> <td><input type="text" size="40" name="Album" value="'.htmlentities((!empty($OldThisFileInfo['comments']['album']) ? implode(', ', $OldThisFileInfo['comments']['album'] ) : ''), ENT_QUOTES).'"></td></tr>';
echo '<tr><td align="right"><b>Year</b></td> <td><input type="text" size="4" name="Year" value="'.htmlentities((!empty($OldThisFileInfo['comments']['year']) ? implode(', ', $OldThisFileInfo['comments']['year'] ) : ''), ENT_QUOTES).'"></td></tr>';
$TracksTotal = '';
$TrackNumber = '';
if (!empty($OldThisFileInfo['comments']['track_number']) && is_array($OldThisFileInfo['comments']['track_number'])) {
$RawTrackNumberArray = $OldThisFileInfo['comments']['track_number'];
} elseif (!empty($OldThisFileInfo['comments']['track']) && is_array($OldThisFileInfo['comments']['track'])) {
$RawTrackNumberArray = $OldThisFileInfo['comments']['track'];
} else {
$RawTrackNumberArray = array();
}
foreach ($RawTrackNumberArray as $key => $value) {
if (strlen($value) > strlen($TrackNumber)) {
// ID3v1 may store track as "3" but ID3v2/APE would store as "03/16"
$TrackNumber = $value;
}
}
if (strstr($TrackNumber, '/')) {
list($TrackNumber, $TracksTotal) = explode('/', $TrackNumber);
}
echo '<tr><td align="right"><b>Track</b></td><td><input type="text" size="2" name="Track" value="'.htmlentities($TrackNumber, ENT_QUOTES).'"> of <input type="text" size="2" name="TracksTotal" value="'.htmlentities($TracksTotal, ENT_QUOTES).'"></TD></TR>';
$ArrayOfGenresTemp = getid3_id3v1::ArrayOfGenres(); // get the array of genres
foreach ($ArrayOfGenresTemp as $key => $value) { // change keys to match displayed value
$ArrayOfGenres[$value] = $value;
}
unset($ArrayOfGenresTemp); // remove temporary array
unset($ArrayOfGenres['Cover']); // take off these special cases
unset($ArrayOfGenres['Remix']);
unset($ArrayOfGenres['Unknown']);
$ArrayOfGenres[''] = '- Unknown -'; // Add special cases back in with renamed key/value
$ArrayOfGenres['Cover'] = '-Cover-';
$ArrayOfGenres['Remix'] = '-Remix-';
asort($ArrayOfGenres); // sort into alphabetical order
echo '<tr><th align="right">Genre</th><td><select name="Genre">';
$AllGenresArray = (!empty($OldThisFileInfo['comments']['genre']) ? $OldThisFileInfo['comments']['genre'] : array());
foreach ($ArrayOfGenres as $key => $value) {
echo '<option value="'.htmlentities($key, ENT_QUOTES).'"';
if (in_array($key, $AllGenresArray)) {
echo ' selected="selected"';
unset($AllGenresArray[array_search($key, $AllGenresArray)]);
sort($AllGenresArray);
}
echo '>'.htmlentities($value).'</option>';
}
echo '</select><input type="text" name="GenreOther" size="10" value="'.htmlentities((!empty($AllGenresArray[0]) ? $AllGenresArray[0] : ''), ENT_QUOTES).'"></td></tr>';
echo '<tr><td align="right"><b>Write Tags</b></td><td>';
foreach ($ValidTagTypes as $ValidTagType) {
echo '<input type="checkbox" name="TagFormatsToWrite[]" value="'.$ValidTagType.'"';
if (count($ValidTagTypes) == 1) {
echo ' checked="checked"';
} else {
switch ($ValidTagType) {
case 'id3v2.2':
case 'id3v2.3':
case 'id3v2.4':
if (isset($OldThisFileInfo['tags']['id3v2'])) {
echo ' checked="checked"';
}
break;
default:
if (isset($OldThisFileInfo['tags'][$ValidTagType])) {
echo ' checked="checked"';
}
break;
}
}
echo '>'.$ValidTagType.'<br>';
}
if (count($ValidTagTypes) > 1) {
echo '<hr><input type="checkbox" name="remove_other_tags" value="1"> Remove non-selected tag formats when writing new tag<br>';
}
echo '<tr><td>tempo</td><td><input type="text" name="COMM" value="MusicMatch_TempoSlow"/></td></tr>';
//echo '<tr><td align="right"><b>Write Tags</b></td><td>';
//echo '<tr><td align="right"><b>Comment</b></td><td><textarea cols="30" rows="3" name="Comment" wrap="virtual">'.((isset($OldThisFileInfo['comments']['comment']) && is_array($OldThisFileInfo['comments']['comment'])) ? implode("\n", $OldThisFileInfo['comments']['comment']) : '').'</textarea></td></tr>';
echo '<tr><td align="right"><b>Picture</b><br>(ID3v2 only)</td><td><input type="file" name="userfile" accept="image/jpeg, image/gif, image/png"><br>';
echo '<select name="APICpictureType">';
$APICtypes = getid3_id3v2::APICPictureTypeLookup('', true);
foreach ($APICtypes as $key => $value) {
echo '<option value="'.htmlentities($key, ENT_QUOTES).'">'.htmlentities($value).'</option>';
}
echo '</select></td></tr>';
echo '<tr><td align="center" colspan="2"><input type="submit" name="WriteTags" value="Save Changes"> ';
echo '<input type="reset" value="Reset"></td></tr>';
} else {
echo '<tr><td align="right"><b>Error</b></td><td>'.htmlentities($Filename).' does not exist</td></tr>';
}
echo '</table>';
echo '</form>';
}
echo '</body></html>';
-
- getID3() v1 developer
- Posts:1477
- Joined:Fri May 04, 2001 4:00 pm
- Are you a spambot?:no
- Location:Northern Ontario, Canada
- Contact:
Re: trying to change tag Year
And just to make my life easier, please tell me the contents (e.g. var_dump) of $TagData just before you assign it on this line:
Code: Select all
$tagwriter->tag_data = $TagData;
-
- User
- Posts:8
- Joined:Tue Mar 31, 2015 5:01 am
- Are you a spambot?:no
Re: trying to change tag Year
ok, i'm very really sorry if i'm enough clear..
Code: Select all
var_dump($TagDta) :
array(3) {
["title"]=> array(1) {
[0]=> string(3) "Why"
}
["artist"]=> array(1) {
[0]=> string(1) "-"
}
["year"]=> array(1) {
[0]=> string(4) "1999"
}
}