【问题标题】:PHP - How to get the element before the last element from an array?PHP - 如何从数组中获取最后一个元素之前的元素?
【发布时间】:2011-01-12 18:09:47
【问题描述】:

如何从 PHP5 的数组中获取最后一个元素之前的元素?

【问题讨论】:

    标签: php arrays element


    【解决方案1】:

    这甚至可以在这个数组上工作:

    $array[0] = "hello";
    $array[5] = "how";
    $array[9] = "are";
    
    end($array);
    echo prev($array); // will print "how"
    

    使用 count() 的其他解决方案假设您的数组的索引是按顺序排列的;通过使用 end 和 prev 移动数组指针,您可以获得实际值。尝试在上面的数组上使用 count() 方法,它会失败。

    【讨论】:

    • 这太棒了。我尝试使用标有复选标记的解决方案,但无法使其与我的数组一起使用(从 1 到 20 个可能的计数)。您的解决方案就像一个魅力。谢谢。
    【解决方案2】:
    $array[count($array)-2]
    

    它应该是一个数字索引数组(从零开始)。您应该至少有 2 个元素才能正常工作。 (显然)

    【讨论】:

    • Erik 的回答更正确,它不仅解释了他用非顺序键指示的情况,而且也适用于关联数组(以字符串为键的数组)
    • 这个问题轻描淡写地暗示了主题是一个线性阵列。当数组包含单个元素并且设置了 error_reporting(E_ALL) 时,我的解决方案将失败并显示 Notice: Undefined offset: -1 in /test.php on line 3。 Erik 的解决方案无声无息地失败了。这很糟糕。
    【解决方案3】:

    array_slice 将负偏移量作为第二个参数。这将为您提供一个包含倒数第二项的单项数组:

    $arr = array(1,2,3,4,5,6);
    array_slice($arr, -2, 1);
    

    如果您只想要一个单独的值,您有多种选择。如果您不介意使用中间变量,则可以使用 [0] 获取第一个值或调用 array_pop 或 array_shift,它们都需要通过引用传递的变量,否则您将在严格模式下收到警告。

    或者您可以只使用 array_sum 或 array_product,这有点 hacky,但适用于单项数组。

    【讨论】:

    • 很好的灵活解决方案,用于获取数组中的可变点。 implode('',array_slice($arr, -2, 1)) 一行搞定。
    【解决方案4】:

    一种适用于关联数组和数值数组的方法是使用array_pop() 将元素从数组末尾弹出。

    $last = array_pop($array);
    $second_last = array_pop($array);
    
    // put back the last
    array_push($array, $last);
    

    【讨论】:

      【解决方案5】:

      所有数组都有一个“内部数组指针”,它指向当前数组元素,PHP 有几个函数可以让您在数组中导航并查看当前元素的键和值。 p>

      • end() - 将数组的内部指针设置为其最后一个元素
      • reset() - 将数组的内部指针设置为其第一个元素
      • prev() - 倒回内部数组指针
      • next() - 推进数组的内部数组指针
      • current() - 返回数组中的当前元素
      • key() - 从数组中获取密钥
      • each() - 从数组中返回当前键值对并推进数组光标

      无论数组是空的、顺序的还是关联的,这些函数都可以工作,并且由于示例中没有指定数组,我假设这必须适用于任何数组。

      $array = array(
          'before_last' => false,
          'last' => false,
      );
      
      end($array); /* 
      - set pointer to last element -> $array['last']
      - return new current element value if it exists, -> false
      - else return FALSE 
      */
      
      prev($array); /* 
      - set pointer one place before current pointer -> $array['before_last']
      - return new current element value if it exists, -> false
      - else return FALSE 
      */
      
      if(!is_null(key($array)){ /* 
      - return current element key if it exists -> "before_last"
      - else return NULL
      */
          $before_last_element_value = current($array); /* 
          - return current element value if it exists, -> false
          - else return FALSE 
          */
      }
      

      如您所见,预期结果 (false) 和不存在元素的结果相同 (FALSE),因此您无法使用返回的元素值检查元素是否存在,元素键不同。

      密钥可以是integerstring。该值可以是任何typesource

      key() 如果元素存在则返回当前键的值,否则返回 NULL。 有效的键永远不能为 NULL,因此如果返回 null,我们可以确定该元素不存在。

      【讨论】:

        【解决方案6】:
        // Indexed based array
        $test = array('a','b','c','d','e');
        $count = count($test);
        print $test[$count-2];
        
        // Associative Array
        $months = array(
                 'jan'=>'January', 
                 'feb' => 'february', 
                 'mar' => 'March', 
                 'apr' => 'April'
            );
        
        $keys = array_keys($months);
        $count = count($keys);
        print $keys[$count-2];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-03
          • 1970-01-01
          • 2022-06-28
          • 1970-01-01
          • 1970-01-01
          • 2012-03-31
          相关资源
          最近更新 更多