3

我有这个 $_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关联数组中可用,我需要提取该值(这是一个数组,因为末尾有 [])。

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

对不起,一开始不清楚^^


更新 2

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

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

4

4 回答 4

3

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

或者甚至更好地将整个人转换为对象。

$person = (object)$_POST['person'];
echo $person->name // Call it
于 2012-09-02T10:20:10.497 回答
0

要非常具体的问题:

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

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

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

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

好吧,如果我们正在谈论,那么我们$_POST可能正在处理一个表格。为了保持你的代码干净和可维护,你应该像你一样使用更深的数组。

为什么?

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

更新

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

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

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

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

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. 快一点
于 2012-09-02T10:35:49.507 回答
0

预优化是魔鬼- 直到你真的遇到这段代码导致你的软件开发工作出现瓶颈的地方,你真的应该避免任何优化,你的瓶颈更有可能将在数据库中,在您注意到速度下降之前。

首先 - 让它工作。第二 - 改进它。

从您提供的数组中,您可以执行以下操作:

foreach ($arr['person']['title'] as $title){
  if ($title == $match_condition) // do something
}
于 2012-09-02T11:09:49.253 回答
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库。

于 2012-09-02T14:49:56.157 回答