WordPress.org

Make WordPress Core

Ticket #28666: 28666.2.diff

File 28666.2.diff, 4.3 KB (added by trepmal, 5 years ago)
  • src/wp-includes/functions.php

     
    28862886 *
    28872887 * @param array $list A list of objects or arrays
    28882888 * @param int|string $field A field from the object to place instead of the entire object
     2889 * @param int|string $index_key A field from the object to use as keys for the new array
    28892890 * @return array
    28902891 */
    2891 function wp_list_pluck( $list, $field ) {
    2892         foreach ( $list as $key => $value ) {
    2893                 if ( is_object( $value ) )
    2894                         $list[ $key ] = $value->$field;
    2895                 else
    2896                         $list[ $key ] = $value[ $field ];
     2892function wp_list_pluck( $list, $field, $index_key = null ) {
     2893        $newlist = array();
     2894        if ( $index_key ) {
     2895                foreach ( $list as $value ) {
     2896                        if ( is_object( $value ) ) {
     2897                                if ( isset( $value->$index_key ) ) {
     2898                                        $newlist[ $value->$index_key ] = $value->$field;
     2899                                } else {
     2900                                        $newlist[] = $value->$field;
     2901                                }
     2902                        } else {
     2903                                if ( isset( $value[ $index_key ] ) ) {
     2904                                        $newlist[ $value[ $index_key ] ] = $value[ $field ];
     2905                                } else {
     2906                                        $newlist[] = $value[ $field ];
     2907                                }
     2908                        }
     2909                }
     2910        } else {
     2911                foreach ( $list as $key => $value ) {
     2912                        if ( is_object( $value ) ) {
     2913                                $newlist[ $key ] = $value->$field;
     2914                        } else {
     2915                                $newlist[ $key ] = $value[ $field ];
     2916                        }
     2917                }
    28972918        }
    28982919
    2899         return $list;
     2920        return $newlist;
    29002921}
    29012922
    29022923/**
  • tests/phpunit/tests/functions/listFilter.php

     
    1111
    1212        function setUp() {
    1313                parent::setUp();
    14                 $this->array_list['foo'] = array( 'name' => 'foo', 'field1' => true, 'field2' => true, 'field3' => true, 'field4' => array( 'red' ) );
    15                 $this->array_list['bar'] = array( 'name' => 'bar', 'field1' => true, 'field2' => true, 'field3' => false, 'field4' => array( 'green' ) );
    16                 $this->array_list['baz'] = array( 'name' => 'baz', 'field1' => true, 'field2' => false, 'field3' => false, 'field4' => array( 'blue' ) );
     14                $this->array_list['foo'] = array( 'name' => 'foo', 'id' => 'f', 'field1' => true, 'field2' => true, 'field3' => true, 'field4' => array( 'red' ) );
     15                $this->array_list['bar'] = array( 'name' => 'bar', 'id' => 'b', 'field1' => true, 'field2' => true, 'field3' => false, 'field4' => array( 'green' ) );
     16                $this->array_list['baz'] = array( 'name' => 'baz', 'id' => 'z', 'field1' => true, 'field2' => false, 'field3' => false, 'field4' => array( 'blue' ) );
    1717                foreach ( $this->array_list as $key => $value ) {
    1818                        $this->object_list[ $key ] = (object) $value;
    1919                }
     
    6666                $this->assertEquals( array( 'foo' => 'foo', 'bar' => 'bar', 'baz' => 'baz' ) , $list );
    6767        }
    6868
     69        /**
     70         * @ticket 28666
     71         */
     72        function test_wp_list_pluck_index_key() {
     73                $list = wp_list_pluck( $this->array_list, 'name', 'id' );
     74                $this->assertEquals( array( 'f' => 'foo', 'b' => 'bar', 'z' => 'baz' ), $list );
     75        }
     76
     77        /**
     78         * @ticket 28666
     79         */
     80        function test_wp_list_pluck_object_index_key() {
     81                $list = wp_list_pluck( $this->object_list, 'name', 'id' );
     82                $this->assertEquals( array( 'f' => 'foo', 'b' => 'bar', 'z' => 'baz' ), $list );
     83        }
     84
     85        /**
     86         * @ticket 28666
     87         */
     88        function test_wp_list_pluck_missing_index_key() {
     89                $list = wp_list_pluck( $this->array_list, 'name', 'nonexistent' );
     90                $this->assertEquals( array( 0 => 'foo', 1 => 'bar', 2 => 'baz' ), $list );
     91        }
     92
     93        /**
     94         * @ticket 28666
     95         */
     96        function test_wp_list_pluck_partial_missing_index_key() {
     97                $array_list = $this->array_list;
     98                unset( $array_list[ 'bar']['id'] );
     99                $list = wp_list_pluck( $array_list, 'name', 'id' );
     100                $this->assertEquals( array( 'f' => 'foo', 0 => 'bar', 'z' => 'baz' ), $list );
     101        }
     102
     103        /**
     104         * @ticket 28666
     105         */
     106        function test_wp_list_pluck_mixed_index_key() {
     107                $mixed_list = $this->array_list;
     108                $mixed_list['bar'] = (object) $mixed_list['bar'];
     109                $list = wp_list_pluck( $mixed_list, 'name', 'id' );
     110                $this->assertEquals( array( 'f' => 'foo', 'b' => 'bar', 'z' => 'baz' ), $list );
     111        }
     112
    69113        function test_filter_object_list_nested_array_and() {
    70114                $list = wp_filter_object_list( $this->object_list, array( 'field4' => array( 'blue' ) ), 'AND' );
    71115                $this->assertEquals( 1, count( $list ) );