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は連想配列を取りませんが、これを機能させる方法については多くの例があります。In_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
  }
于 2012-10-16T08:50:48.013 に答える
0

あなたはそれを簡単にチェックすることができます

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

次に、挿入するコード

于 2012-10-16T09:02:37.257 に答える
0

array_searchを使用して、配列にその形式の文字列が含まれているかどうかを判断するのはどうですか?そして鍵も手に入れます。

于 2012-10-16T08:49:55.093 に答える