【问题标题】:Extract elements from array so it only consists values of a specified index从数组中提取元素,使其仅包含指定索引的值
【发布时间】:2009-06-08 15:48:03
【问题描述】:

我有一个数组

array(
 array('total'=>10,'v'=>3229),
 array('total'=>20,'v'=>3129),
 array('total'=>30,'v'=>3391),
);

有没有一行的方式在PHP中将上面的内容转换成下面的内容?

array(10,20,30);

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    你可以使用 array_map,但它需要多一点,除非你有 PHP 5.3+:

    $original = array(
                   array('total'=>10,'v'=>3229),
                   array('total'=>20,'v'=>3129),
                   array('total'=>30,'v'=>3391),
                 );
    
    
    // Callback function
    function valueOnly ($element) {
       return $element['total'];
    } 
    
    $result = array_map('valueOnly', $original);
    

    使用 PHP 5.3+:

    $index = 'total';
    $lambda = function ($value) use ($index) { return $value[$index]; };
    
    // Here is the one-liner that can be reused if you save the $lamda-function.
    $result = array_map($lambda, $original);
    

    无论哪种方式,我建议您为此创建一个方法,因为它增加了可读性和可重用性。

    【讨论】:

      【解决方案2】:

      总有以分号结尾的句子语言:

      foreach ($a as $v){ foreach($v as $k=>$v2) { if($k == 'total') {$r[] = $v2;}}};
      

      现在我不会写这个了。

      这个我可能会写,但是你必须先创建一个函数,它总结了不止一行(或者没有,但我拒绝在一行中写这个:-))

      function get_value($x) {
          return $x['total'];
      }
      
      $r = array_map("get_value",$a);
      

      【讨论】:

      • 删除无意义的换行符是作弊。我认为 OP 的“一行”意味着“一个声明”。
      【解决方案3】:

      定义单行。正如 Vinko 所展示的,一行中可能有大量语句。这是我目前能想到的最好的单行解决方案(单行是 foreach 语句):

      $arr1 = array(
         array('total'=>10,'v'=>3229),
         array('total'=>20,'v'=>3129),
         array('total'=>30,'v'=>3391),
      );
      
      $arr2 = array();
      foreach ($arr1 as $item) $arr2[] = $item['total'];
      

      显然不止一行,但我假设您已经初始化了 $arr1 和 $arr2 数组。

      【讨论】:

        【解决方案4】:

        我有两种非常酷的方法可以一起为您的目的(以及它的变体)工作。

        /**
         * Pivots a 2 dimensional array.
         *
         * Turns the column names in a two dimensional array into the rows,
         * using the original array's row indexes as column names.  The input
         * array and its rows may be integer-indexed or a hash.
         *
         * You can optionally specify a column or list of columns to return as rows
         *
         * Example -
         * <pre>
         *
         * input:
         * $aIn => array([0] => array([name] => 'John Doe', [phone] => '555-1000', 'happy'),
         *               [1] => array([name] => 'Fred Doodle', [phone] => '555-2000', 'sad', [title] => 'President'),...
         *
         * output:
         * array([name]  => array([0] => 'John Doe', [1] => 'Fred Doodle',...),
         *       [phone] => array([0] => '555-1000', [1] => '555-2000',...),
         *       [0]     => array([0] => 'happy',    [1] => 'sad',...),
         *       [title] => array([1] => 'President'))
         *
         * </pre>
         * @param  array $aInput    A two dimensional array
         * @param  mixed $mColumns  An array of columns or single column name. If nothing
         *                          passed, then all columns from each input row will become rows
         *                          in the output array.
         * @return array            Pivoted array !!! If a single column name is passed in $mColumns
         *                          The return will be a one-dimensional array; you will get back
         *                          an array of the values for that column.
         */
        static function pivot($aIn, $mColumns = null) {
        
            // Initialize the output
            $aOut = array();
            /*
             * If input list of column names, then initialize, in case the
             * input array is empty or doesn't have those columns
             */
            if (is_array($mColumns) && !empty($mColumns)) {
                foreach ($mColumns as $col) {
                    $aOut[$col] = array();
                }
            }
            /*
             * Output array needs to be passed inside an array to be passed by reference.
             */
            // TODO As of PHP 5.2.3, could replace callback arg below with simply "xarray::pivot_row", but production uses 5.1.6
            array_walk($aIn, array("xarray", "pivot_row"), array(&$aOut));
            return (empty($aOut) || is_null($mColumns) ? $aOut : (is_array($mColumns) ? array_intersect_key($aOut, array_flip($mColumns)) : $aOut[$mColumns]));
        }
        
        public static function pivot_row($aRow, $mKey, $aSpec) {
            foreach ($aRow as $k => $v) {
                $aSpec[0][$k][$mKey] = $v;
            }
        }
        

        【讨论】:

          【解决方案5】:

          讨厌的解决方案:

          $source = array(
           array('total'=>10,'v'=>3229),
           array('total'=>20,'v'=>3129),
           array('total'=>30,'v'=>3391),
          );
          
          $totals = array_map( create_function('$a', 'return $a[\'total\'];'), $source );
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-08-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-12-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多