Я использую плагин wordpress для расширенного проектирования / логики / обработки форм, и одним из его (самых больших) недостатков является неудобный способ предоставления данных формы. Данные представлены в виде массива с двумя или тремя элементами для каждого поля.
если это скрытое поле:
$$$ n => id
- где n - порядок поля в форме, а NAME это имя / идентификатор. id => значение
- где id - это имя / идентификатор, а значение - это значение. Если это видимое поле:
$$$ n => LABEL
- где n - порядок поля в форме, а LABEL - удобочитаемая метка. $$$ id => LABEL
- где id - это имя / идентификатор поля LABEL => value
- где value - это то, что я на самом деле хочу. Я пытаюсь написать функцию, которая будет использовать этот ужасный массив и возвращать более простой с одним id => value
пара для каждого поля.
Например, он возьмет следующее (порядок полей не может быть гарантирован):
array(
'$$$1' => 'command',
'command' => 'signup',
'$$$2' => 'First Name',
'$$$firstname' => 'First Name',
'First Name' => 'John',
'$$$3' => 'Email Address',
'$$$email' => 'Email Address',
'Email Address' => 'john@example.com'
);
И вернет:
array(
'command' => 'signup',
'email' => 'john@example.com',
'firstname' => 'John'
);
Этот код работает, но чувствует себя очень неловко. Можете ли вы помочь уточнить это? Спасибо! (Моя стратегия - игнорировать все, кроме полей $$$ n
, поскольку они идентичны для всех форм, и нет простого способа определить, является ли данное поле скрытым или нет. )
function get_cforms_data($cformsdata) {
$data = array();
foreach ($cformsdata as $key => $value) {
if (strpos($key, '$$$') === 0) {
$newkey = substr($key, 3);
if (is_numeric($newkey)) {
$keys = array_keys($cformsdata, $value);
if (count($keys) == 1) {
// must be a hidden field - NAME only appears once
$data[$value] = $cformsdata[$value];
} else {
// non-hidden field. Isolate id.
foreach($keys as $k) {
if ($k == $key) {
// $$$n - ignore it
continue;
} else {
// $$$id
$k = substr($k, 3);
$data[$k] = $cformsdata[$value];
}
}
}
}
}
}
return $data;
}
Вот что я бы сделал, хотя я не думаю, что это намного чище, чем ваш вариант или вариант NullUserException:
function get_cforms_data($cforms_data) {
$ret = array();
$label_to_id = array();
$label_or_id_to_value = array();
foreach ($cforms_data as $key => $value) {
if (substr($key, 0, 3) === "$$$") {
if (!is_numeric($id = substr($key, 3))) {
$label_to_id[$value] = $id;
}
} else {
$label_or_id_to_value[$key] = $value;
}
}
foreach ($label_or_id_to_value as $key => $value) {
$ret[isset($label_to_id[$key]) ? $label_to_id[$key] : $key] = $value;
}
return $ret;
}