<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xml:id="function.array-column" xmlns="http://docbook.org/ns/docbook">
 <refnamediv>
  <refname>array_column</refname>
  <refpurpose>Return the values from a single column in the input array</refpurpose>
 </refnamediv>
 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <type>array</type><methodname>array_column</methodname>
   <methodparam><type>array</type><parameter>array</parameter></methodparam>
   <methodparam><type class="union"><type>int</type><type>string</type><type>null</type></type><parameter>column_key</parameter></methodparam>
   <methodparam choice="opt"><type class="union"><type>int</type><type>string</type><type>null</type></type><parameter>index_key</parameter><initializer>&null;</initializer></methodparam>
  </methodsynopsis>
  <para>
   <function>array_column</function> returns the values from a single column of
   the <parameter>array</parameter>, identified by the
   <parameter>column_key</parameter>. Optionally, an
   <parameter>index_key</parameter> may be provided to index the values in the
   returned array by the values from the <parameter>index_key</parameter>
   column of the input array.
  </para>
 </refsect1>
 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>array</parameter></term>
     <listitem>
      <para>
       A multi-dimensional array or an array of objects from which to pull a
       column of values from. If an array of objects is provided, then public
       properties can be directly pulled. In order for protected or private
       properties to be pulled, the class must implement both the
       <function>__get</function> and <function>__isset</function> magic
       methods.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>column_key</parameter></term>
     <listitem>
      <para>
       The column of values to return. This value may be an integer key of the
       column you wish to retrieve, or it may be a string key name for an
       associative array or property name. It may also be &null; to return
       complete arrays or objects (this is useful together with
       <parameter>index_key</parameter> to reindex the array).
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>index_key</parameter></term>
     <listitem>
      <para>
       The column to use as the index/keys for the returned array. This value
       may be the integer key of the column, or it may be the string key name.
       The value is <link linkend="language.types.array.key-casts">cast</link>
       as usual for array keys (however, prior to PHP 8.0.0, objects supporting
       conversion to string were also allowed).
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>
 </refsect1>
 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   Returns an array of values representing a single column from the input array.
  </para>
 </refsect1>
 <refsect1 role="changelog">
  &reftitle.changelog;
  <para>
   <informaltable>
    <tgroup cols="2">
     <thead>
      <row>
       <entry>&Version;</entry>
       <entry>&Description;</entry>
      </row>
     </thead>
     <tbody>
      <row>
       <entry>8.0.0</entry>
       <entry>
        Objects in columns indicated by <parameter>index_key</parameter> parameter
        will no longer be cast to string and will now throw a <classname>TypeError</classname> instead.
       </entry>
      </row>
     </tbody>
    </tgroup>
   </informaltable>
  </para>
 </refsect1>
 <refsect1 role="examples">
  &reftitle.examples;
  <para>
   <example>
    <title>Get the column of first names from a recordset</title>
    <programlisting role="php">
<![CDATA[
<?php
// Array representing a possible record set returned from a database
$records = array(
    array(
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe',
    ),
    array(
        'id' => 3245,
        'first_name' => 'Sally',
        'last_name' => 'Smith',
    ),
    array(
        'id' => 5342,
        'first_name' => 'Jane',
        'last_name' => 'Jones',
    ),
    array(
        'id' => 5623,
        'first_name' => 'Peter',
        'last_name' => 'Doe',
    )
);
 
$first_names = array_column($records, 'first_name');
print_r($first_names);
?>
]]>
    </programlisting>
    &example.outputs;
    <screen role="php">
<![CDATA[
Array
(
    [0] => John
    [1] => Sally
    [2] => Jane
    [3] => Peter
)
]]>
    </screen>
   </example>
  </para>
  <para>
   <example>
    <title>
     Get the column of last names from a recordset, indexed by the "id" column
    </title>
    <programlisting role="php">
<![CDATA[
<?php
// Using the $records array from Example #1
$last_names = array_column($records, 'last_name', 'id');
print_r($last_names);
?>
]]>
    </programlisting>
    &example.outputs;
    <screen role="php">
<![CDATA[
Array
(
    [2135] => Doe
    [3245] => Smith
    [5342] => Jones
    [5623] => Doe
)
]]>
    </screen>
   </example>
  </para>
  <para>
   <example>
    <title>
     Get the column of usernames from the public "username" property of an
     object
    </title>
    <programlisting role="php">
<![CDATA[
<?php

class User
{
    public $username;

    public function __construct(string $username)
    {
        $this->username = $username;
    }
}

$users = [
    new User('user 1'),
    new User('user 2'),
    new User('user 3'),
];

print_r(array_column($users, 'username'));
?>
]]>
    </programlisting>
    &example.outputs;
    <screen role="php">
<![CDATA[
Array
(
    [0] => user 1
    [1] => user 2
    [2] => user 3
)
]]>
    </screen>
   </example>
  </para>
  <para>
   <example>
    <title>
     Get the column of names from the private "name" property of an object
     using the magic <function>__get</function> method.
    </title>
    <programlisting role="php">
<![CDATA[
<?php

class Person
{
    private $name;

    public function __construct(string $name)
    {
        $this->name = $name;
    }

    public function __get($prop)
    {
        return $this->$prop;
    }

    public function __isset($prop) : bool
    {
        return isset($this->$prop);
    }
}

$people = [
    new Person('Fred'),
    new Person('Jane'),
    new Person('John'),
];

print_r(array_column($people, 'name'));
?>
]]>
    </programlisting>
    &example.outputs;
    <screen role="php">
<![CDATA[
Array
(
    [0] => Fred
    [1] => Jane
    [2] => John
)
]]>
    </screen>
   </example>
   If <function>__isset</function> is not provided, then an empty array will be
   returned.
  </para>
 </refsect1>

</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->
