Фильтрация массивов с несколькими поисками значения ключа в PHP - PullRequest
1 голос
/ 24 августа 2010

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

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

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

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

  1. $$$n => LABEL - где n - порядок поля в форме, а LABEL - удобочитаемая метка.
  2. $$$id => LABEL - где id - имя / идентификатор поля
  3. LABEL => 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;
}

Ответы [ 2 ]

2 голосов
/ 24 августа 2010

Вот рабочая версия:

$i=0;
$result = array();

while (array_key_exists('$$$' . ++$i, $arr)) {
    $key = $arr['$$$' . $i];
    $result[$key] = $arr[$key];
}

Будет напечатано:

Array
(
    [command] => signup
    [First Name] => John
    [Email Address] => john@example.com
)

Вот другая версия. Это намного уродливее, но делает именно то, что вы хотите (как я понял)

function get_cforms_data($cformsdata) {
    $i=0;
    $result = array();
    $flipped = array_flip($arr);

    while (array_key_exists('$$$' . ++$i, $arr)) {
        $key = $arr['$$$' . $i];

        $realKey = (!preg_match('~^\${3}\d+$~', $flipped[$key])) ? 
                    substr($flipped[$key], 3) : $key;

        $result[$realKey] = $arr[$key];
    } 
    return $result;   
}

Возвращает:

Array
(
    [command] => signup
    [firstname] => John
    [email] => john@example.com
)

Посмотрите, как это работает: http://ideone.com/5mkbx

0 голосов
/ 24 августа 2010

Вот что я, вероятно, сделаю, хотя я не думаю, что это намного чище, чем у вас или у 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...