PHP - 提取关联POST数据的最佳方法

时间:2012-09-02 10:15:49

标签: php arrays performance

我有这个$ _POST数组的东西:

  'name' => string '' (length=0)
  'limit' => string '100' (length=3)

  'timeframe' => 
    array
      'start' => string '00:00' (length=5)
      'end' => string '23:30' (length=5)

  'person' => 
    array
      'test' => string '' (length=0)
      'title' => 
        array
          0 => string 'value1' (length=2)
          1 => string 'value2' (length=3)

我想为名为person[title][]的字段提取数据,有效执行此操作的最佳方法是什么?

实际上我把问题缩小到这个例子,但是我更普遍地实现了这个,所以我可以在我的代码中为任何数组命名字段提取数据。

提前致谢


更新1

好的,我想我不清楚,这里又出现了问题:

我有一个这种格式的字段名:name_1[name_2]..[name_n][]并且它的值在$_POST关联数组中可用,我需要提取该值(这是一个数组,因为最后的那个[] )。

我可以通过运行preg_match或somethin'从原始字段名中提取子名,然后循环遍历数组,直到我使用提取的索引找到值。但我不确定这是否真的是最好和/或最有效的方式。

抱歉在第一时间不清楚^^


更新2

伙计们,我说我把问题缩小到这个例子,但在我的实际应用程序中没有person的东西。我正在开发一个数据解析器引擎来处理大量数据,而这个功能正是它所需要的。希望它;现在很清楚。

谢谢大家,顺便说一句^^

4 个答案:

答案 0 :(得分:3)

我会使用$title = $_POST['perosn']['title']

甚至更好地接受整个人并将其转换为对象。

$person = (object)$_POST['person'];
echo $person->name // Call it

答案 1 :(得分:0)

非常具体问题:

  

我想为名为person [title] []的字段提取数据,是什么   有效地做到这一点的最好方法是什么?

好吧,<? $person[title][]?> ---我们不能用它来阅读。 如果您尝试阅读您的方式,PHP将产生致命错误。 我们使用[]将新元素推送到给定数组。 再次 - 只添加新项目。 为了阅读这些内容,您只能访问数组所需的key

在您的情况下,您可以访问$_POST['person']['title']

你问的是最好的方法,但这一切都取决于你正在处理的任务。

好吧,如果我们谈论$_POST那么我们可能正在处理一个表格。为了保持代码的清洁和可维护性,您应该使用更深层次的数组。

为什么?

你有<input type="text" name="name_of_the_current[]">(看我们正在定义一个数组)不需要让它更深入。

<强>更新

嘿,我们正在处理简单的形式。为什么$ _POST太深了?嗯,无论如何,这不是一个好主意,原因如下:

1)维护现有的HTML/PHP代码会更加困难。想象一下,如果您必须更新/修改代码中的某些内容。我想这需要一些时间。

2)Deep array也意味着需要更多的时间来迭代它。 (大约~0.0008毫秒(在你的情况下),如果我错了,请纠正我)

我很抱歉,但我必须建议一些更合适的东西:)

1)首先,这个人是PRIMARY AND UNIQUE KEY,对吧?我想是的。

例如, 大多数PHP开发人员通常会这样做:

<?php
//suppose we have it from database or from
$persons = array
(
  'john_123' => array('age' = 40, 'gender' =>'M', 'location' => 'somewhere'),
  'linde_22' => array('age' = 30, 'gender' =>'F', 'location' => 'somewhere_else')  
);

//
print $persons['john_123']['age']; //prints 40...
?>

<强>优势

  1. 很干净
  2. 易于维护
  3. 不太深
  4. 快一点

答案 2 :(得分:0)

Pre-optimization is the devil - 直到你真的遇到一个你正在遇到这个代码片段导致你的软件开发工作瓶颈的地方,你应该真的避免任何优化,它更可能是在您注意到速度下降之前,您的瓶颈将出现在数据库中。

首先 - 让它发挥作用。 第二 - 改进它。

从您提供的阵列中,您可以执行以下操作:

foreach ($arr['person']['title'] as $title){
  if ($title == $match_condition) // do something
}

答案 3 :(得分:0)

好的,你走了:

/**
 * Extracts value from an associative array by fieldname sequence.
 *
 * Example:
 *
 * This string:
 * my_group[my_subgroup][multiselect_field][]
 *
 * Requests the helper to extract the value of: (if exists)
 * $array[my_group][my_subgroup][multiselect_field]
 *
 * @param  string $name  Fieldname string.
 * @param  array  $array Haystack array to dig.
 *
 * @return array  Extracted value or FALSE on failure.
 */
function _extract_value($name, array $array)
{
    // Check if it's a array fieldname, go for brackets
    if (strpos($name, '[') !== FALSE AND preg_match_all('/\[(.*?)\]/', $name, $matches))
    {
        $count  = count($matches[0]);
        $keys[] = current(explode('[', $name));

        // Extract fieldname keys
        for ($i = 0; $i < $count; $i++)
        {
            $matches[1][$i] != '' AND $keys[] = $matches[1][$i];
        }

        return _reduce($array, $keys);
    }

    return FALSE;
}

// --------------------------------------------------------------------

/**
 * Helper: Reduces the array by the passed array of keys which leds to find the value!
 *
 * Traverses a multi-dimensional array until the value of the keys specified
 * in keys array is found. Returns FALSE if not found.
 *
 * @param  array   $array Array to reduce.
 * @param  array   $keys  Array keys sequence. Traverse map in fact.
 * @param  integer $i     $keys array index to start from.
 *
 * @return array          Extracted value or FALSE on failure.
 */
function _reduce($array, $keys, $i = 0)
{
    // Not an array, or a wrong index to start
    if ( ! is_array($array) OR ! isset($keys[$i]))
    {
        return $array;
    }

    // Go deep, find the value
    return isset($array[$keys[$i]])
        ? _reduce($array[$keys[$i]], $keys, $i + 1)
        : FALSE;
}

// --------------------------------------------------------------------

$titles = _extract_value('', $_POST);
var_dump($titles);

取自CodeIgniter的Form_validation库。