1

我有一个动态数组$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);

非常感谢任何帮助。提前致谢

4

5 回答 5

4

而不是in_array,使用preg_replace_callback. 将数组传递给它并匹配日期格式模式。如果模式匹配,则将其替换为回调。

示例(演示):

$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);

不过,使用回调将允许您使用任意日期格式。

于 2012-10-16T08:49:29.843 回答
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);
于 2012-10-16T08:50:36.227 回答
1

in_array 不采用关联数组,但是有很多关于如何使这项工作的示例:Check If In_Array (in Recursive Associative Array)(但一定要寻找更好的;))

至于检查是否有日期,您可以做很多事情。

如果您知道日期将始终采用 dd/mm/yyyy 格式,您可以为此使用正则表达式(谷歌应该给出足够的结果),使用 preg_match 检查值是否包含给定格式的字符串,如果是格式它。

如果可以更改格式(例如,如果它的人工输入,人们倾向于使用 / 或 - 取决于语言细节,只需测试 strtotime(); 是否返回 false 就足够了。

一个示例正则表达式“未经测试”

  if (preg_match('/([0-9]{2})\/([0-9]{2})\/([0-9]{4})/', $date) {
    // date found
  }
于 2012-10-16T08:50:48.013 回答
0

如何使用array_search来确定您的数组是否包含该格式的字符串?也拿到了钥匙。

于 2012-10-16T08:49:55.093 回答
0

你可以很容易地检查它

if($v['date_applied']!="")
{
$date=date_create($v['date_applied']);
$fdate=date_format($date,'Y-m-d');
}

然后你的代码插入

于 2012-10-16T09:02:37.257 回答