Фильтрация массивов с несколькими поисками значений ключей в PHP

Я использую плагин wordpress для расширенного проектирования / логики / обработки форм, и одним из его (самых больших) недостатков является неудобный способ предоставления данных формы. Данные представлены в виде массива с двумя или тремя элементами для каждого поля.

если это скрытое поле:

  1. $$$ n => id - где n - порядок поля в форме, а NAME это имя / идентификатор.
  2. id => значение - где id - это имя / идентификатор, а значение - это значение.

Если это видимое поле:

  1. $$$ n => LABEL - где n - порядок поля в форме, а LABEL - удобочитаемая метка.
  2. $$$ id => LABEL - где id - это имя / идентификатор поля
  3. 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;
}
1
задан Benj 23 August 2010 в 22:13
поделиться

1 ответ

Вот что я бы сделал, хотя я не думаю, что это намного чище, чем ваш вариант или вариант 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;
}
0
ответ дан 2 September 2019 в 21:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: