【问题标题】:PHP: Get n-th item of an associative arrayPHP:获取关联数组的第 n 项
【发布时间】:2011-01-01 03:27:18
【问题描述】:

如果你有一个关联数组:

Array
(
    [uid] => Marvelous
    [status] => 1
    [set_later] => Array
        (
            [0] => 1
            [1] => 0
        )

    [op] => Submit
    [submit] => Submit
)

你想访问第二个项目,你会怎么做? $arr[1] 似乎不起作用:

foreach ($form_state['values']['set_later'] as $fieldKey => $setLater) {
    if (! $setLater) {
        $valueForAll = $form_state['values'][$fieldKey];
        $_SESSION[SET_NOW_KEY][array_search($valueForAll, $form_state['values'])] = $valueForAll; // this isn't getting the value properly
    }
}

这段代码应该产生:

$_SESSION[SET_NOW_KEY]['status'] = 1

但它只会产生一个空白条目。

【问题讨论】:

  • 是否可以将 set_later 中的键更改为字段名称?所以 $form_state['values']['set_later'] = array('uid' => 1, 'status' => 0)?这将解决问题并消除对 array_search 的需求。

标签: php associative-array


【解决方案1】:

您可以使用array_slice获取第二项:

$a= array(
 'hello'=> 'world',
 'how'=> 'are you',
 'an'=> 'array',
);

$second= array_slice($a, 1, 1, true);
var_dump($second);

【讨论】:

    【解决方案2】:

    使用array_slice

    $second = array_slice($array, 1, 1, true);  // array("status" => 1)
    
    // or
    
    list($value) = array_slice($array, 1, 1); // 1
    
    // or
    
    $blah = array_slice($array, 1, 1); // array(0 => 1)
    $value = $blah[0];
    

    【讨论】:

    • 设置 array_slice() 的 perserve_keys 参数似乎对我没有影响:sandbox.onlinephpfunctions.com/code/… -- 我希望能够访问 $blah[ 之类的值,而不是返回键控数组0](如上例所示)。相反,我仍然需要通过键而不是位置来查找我所追求的值。
    • 对于我的应用程序,我需要同时查找第 n 个项目并将其删除,并最终意识到 array_splice(而不是 array_slice)两者兼而有之!
    • 最后一个选项似乎不像描述的那样工作。查看docs,他们声明 preserve_keys:请注意,array_slice() 默认情况下会重新排序和重置数字数组索引。您可以通过将 preserve_keys 设置为 TRUE 来更改此行为。 这意味着最后一个选项会导致 array("status" => 1)
    • @nickf:与上述其他 cmets 中的问题相同,在您的最后一个示例中,最后一个参数必须是 false 以告诉 php not 保留密钥。在您的第一个示例中,您必须添加最后一个参数 true 以使用此保留的“状态”键获得结果(因为没有参数 = 默认 = 假 = 重新索引为 0)
    【解决方案3】:

    如果您在第一个示例中提供的数组对应于 $form_state 则

    $form_state['values']['set_later'][1]
    

    会起作用的。

    否则

    $i = 0;
    foreach ($form_state['values']['set_later'] as $fieldKey => $setLater) {
        if ($i == 1) {
            $valueForAll = $form_state['values'][$fieldKey];
            $_SESSION[SET_NOW_KEY][$fieldKey] = $setLater;
            continue;
        }
        $i++;
    }
    

    【讨论】:

      【解决方案4】:

      我有点困惑。您的代码似乎没有正确的数组键。但是,如果您只想获取数组中的第二个元素,您可以使用:

      $keys = array_keys($inArray);
      $key = $keys[1];
      $value = $inArray[$key];
      

      但是,在考虑了您正在尝试做的事情之后,这样的事情可能会更好:

      $ii = 0;
      $setLaterArr = $form_state['values']['set_later'];
      foreach($form_state['values'] as $key => $value) {
          if($key == 'set_later')
              continue;
          $setLater = $setLaterArr[$ii];
          if(! $setLater) {
              $_SESSION[SET_NOW_KEY][$key] = $value;
          }
          $ii ++;
      }
      

      这有帮助吗?如果未设置 set_later 值,您似乎正在尝试设置会话值。上面的代码就是这样做的。然而,它不是遍历内部数组,而是遍历外部数组并使用索引来跟踪它在内部数组中的位置。这应该是合理的性能。

      【讨论】:

        【解决方案5】:

        这里的每个响应都专注于获取第二个元素,独立于数组的形成方式。

        如果这是你的情况。

        Array
        (
            [uid] => Marvelous
            [status] => 1
            [set_later] => Array
                (
                    [0] => 1
                    [1] => 0
                )
        
            [op] => Submit
            [submit] => Submit
        )
        

        然后就可以通过$array['status']获取第二个元素的值了。

        还有这段代码

        foreach ($form_state['values']['set_later'] as $fieldKey => $setLater) {
            if (! $setLater) {
                $valueForAll = $form_state['values'][$fieldKey];
                $_SESSION[SET_NOW_KEY][array_search($valueForAll, $form_state['values'])] = $valueForAll; // this isn't getting the value properly
            }
        }
        

        我不明白你想做什么,想解释一下吗?

        【讨论】:

          【解决方案6】:

          这是使用array_slicecurrent 的一种方法

          $value = current(array_slice($array, 1, 1)); // returns value only
          

          【讨论】:

            【解决方案7】:
            /**
                     * Get nth item from an associative array
                     * 
                     * 
                     * @param     $arr
                     * @param int $nth
                     *
                     * @return array
                     */
                    function getNthItemFromArr($arr, $nth = 0){
                        $nth = intval($nth);
                        if(is_array($arr) && sizeof($arr) > 0 && $nth > 0){
                            $arr = array_slice($arr,$nth-1, 1, true);
                        }
                        return $arr;
                    }//end function getNthItemFromArr
            

            【讨论】:

              猜你喜欢
              • 2015-06-26
              • 1970-01-01
              • 2015-03-03
              • 2013-02-21
              • 1970-01-01
              • 2021-11-06
              • 1970-01-01
              • 2013-11-18
              • 2020-05-17
              相关资源
              最近更新 更多