我有一个动态数组$v
,其内容根据提交的表单而变化。某些表单可能包含日期字段,而其他表单可能没有。对于所有表单,我使用相同的数组$v
将值存储在key=>value
对中,然后将其插入表中。所以有时数组可能看起来像
$v = array('patron_name'=>'some value',
'place' => 'again some value',
'pin' => 'blah blah')
而在其他时候它可能看起来像
$v = array('joomla'=>'some value again',
'date_applied' => '23/04/2012',
)
如上所述,内容因形式而异。我正在寻找的是首先检查$v
是否包含dd/mm/yyy
形式的值,如果是,请将其更改为yyyy-mm-dd
格式以插入表格中。我可以处理转换部分,但我一直在确定$v
是否包含日期。
所以基本上我打算以这种方式继续下去:
if(in_array('date in dd/mm/yyyy format', $v))
{
// change it to yyyy-mm-dd
}
// and then insert into table
$flag = insert($tablename, $v);
任何帮助非常感谢。提前致谢
答案 0 :(得分:4)
使用preg_replace_callback
而不是in_array
。将数组传递给它并匹配日期格式模式。如果模式匹配,请将其替换为回调。
示例(demo):
$v = array(
'joomla'=>'some value again',
'date_applied' => '23/04/2012',
);
$result = preg_replace_callback('#^\d{1,2}/\d{1,2}/\d{4}$#', function($match) {
return DateTime::createFromFormat('d/m/Y', $match[0])->format('Y-m-d');
}, $v);
print_r($result);
在旁注中,由于Ymd包含与d / m / Y相同的值,因此您不必严格使用回调,而只能使用preg_replace
(demo):
$result = preg_replace('#^(\d{1,2})/(\d{1,2})/(\d{4})$#', '$3-$2-$1', $v);
使用回调可以让你使用任意日期格式。
答案 1 :(得分:1)
您可以使用array_walk()
加上preg_match()
:
function handle_dates(&$v)
{
if (preg_match('#^(\d{1,2})/(\d{1,2})/(\d{4})$#', $v, $matches)) {
$v = sprintf("%02d-%02d-%02d", $matches[3], $matches[2], $matches[1]);
}
}
array_walk($v, 'handle_dates');
或者:
function replace_dates($v)
{
return preg_replace('#^(\d{2})/(\d{2})/(\d{4})$#', '\3-\2-\1', $v);
}
$v = array_map('replace_dates', $v);
答案 2 :(得分:1)
in_array不接受一个关联数组,但是有很多关于如何使这个工作的例子:Check If In_Array (in Recursive Associative Array)(但是肯定地寻找更好的一个;)
至于检查是否有日期可以做多件事。
如果您知道日期将始终采用dd / mm / yyyy格式,则可以使用正则表达式(google应该给出足够的结果),使用preg_match检查值是否包含给定格式的字符串,如果这样格式化它。
如果格式可以改变(例如,如果它的人工输入,人们倾向于使用/或 - 取决于语言细节,只需测试strtotime();返回false或不足够。
示例正则表达式'untested'
if (preg_match('/([0-9]{2})\/([0-9]{2})\/([0-9]{4})/', $date) {
// date found
}
答案 3 :(得分:0)
如何使用array_search确定您的数组是否包含该格式的字符串?并获得关键。
答案 4 :(得分:0)
您可以轻松查看
if($v['date_applied']!="")
{
$date=date_create($v['date_applied']);
$fdate=date_format($date,'Y-m-d');
}
然后你的代码插入