Есть ли функция для извлечения "столбца" из массива в PHP?

У меня есть массив массивов со следующей структурой:

array(array('page' => 'page1', 'name' => 'pagename1')
      array('page' => 'page2', 'name' => 'pagename2')
      array('page' => 'page3', 'name' => 'pagename3'))

Есть ли встроенная функция, которая вернет новый массив только с значениями ключей 'name'? поэтому я бы получил:

array('pagename1', 'pagename2', 'pagename3')

Ответы

Ответ 1

Почему это должна быть встроенная функция? Нет, их нет, напишите сами.

Вот хороший и легкий, в отличие от других в этой теме.

$namearray = array();

foreach ($array as $item) {
    $namearray[] = $item['name'];
}

Ответ 2

По PHP 5.5 вы можете использовать array_column():

<?php
$samples=array(
            array('page' => 'page1', 'name' => 'pagename1'),
            array('page' => 'page2', 'name' => 'pagename2'),
            array('page' => 'page3', 'name' => 'pagename3')
            );
$names = array_column($samples, 'name');
print_r($names);

Посмотрите в действии

Ответ 3

Вот функциональный способ:

$data = array(
            array('page' => 'page1', 'name' => 'pagename1'),
            array('page' => 'page2', 'name' => 'pagename2'),
            array('page' => 'page3', 'name' => 'pagename3'));

$result = array_map(create_function('$arr', 'return $arr["name"];'), $data);
print_r($result);

Ответ 4

Хорошо. По крайней мере, для PHP > 5.5.0 и называется array_column

Функция PHP принимает необязательный параметр $index_key, который - согласно веб-сайту PHP - указывает:

$index_key

Столбец для использования в качестве индекса/ключей для возвращаемого массива. Это значение может быть целым ключом столбца или может быть имя строкового ключа

В ответах здесь я вижу разделенную версию без необязательного параметра. Мне это было нужно, вот, вот полная функция:

if (!function_exists('array_column')) {
    function array_column($array, $column, $index_key = null) {
        $toret = array();
        foreach ($array as $key => $value) {
            if ($index_key === null){
                $toret[] = $value[$column];
            }else{
                $toret[$value[$index_key]] = $value[$column];
            }
        }
        return $toret;
    }
}

Ответ 5

Похож на решение fuentesjrs, но немного более общий с помощью array_walk() с пользовательским обратным вызовом:

// Define the callback
function extract_named_sub_elements(&$item, $key, $name) {
  $item = $item[$name];
}

// Test data
$original = array(
  array('page' => 'page1', 'name' => 'pagename1'),
  array('page' => 'page2', 'name' => 'pagename2'),
  array('page' => 'page3', 'name' => 'pagename3'),
);

// Use a copy, as array_walk() operates directly on the passed in array
$copy = $original;

// Substitute 'name' with whatever element you want to extract, e.g. 'page'
array_walk($copy, 'extract_named_sub_elements', 'name');

print_r($copy);

Ответ 6

if (!function_exists('array_column')) {
    function array_column($array,$column) {
    $col = array();
    foreach ($array as $k => $v) {
        $col[]=$v[$column];
    }
    return $col;
    }
}

Это должно работать для версий php < 5.5 и деградировать в случае существования функции

Ответ 7

Да, есть встроенная функция php, называемая array_column, которая делает то, что вы ищете.

Вы бы назвали это чем-то вроде $name_keys = array_column($array, 'name');, чтобы получить результат, который вы ищете.

Для получения дополнительной информации обратитесь к следующей записи в руководстве по PHP:

http://php.net/manual/en/function.array-column.php

Ответ 8

Вы можете расширить класс ArrayIterator и переопределить метод mixed current(void).

class Foo extends ArrayIterator {
  protected $index;
  public function __construct($array, $index) {
    parent::__construct($array);
    $this->index = $index;
  }

  public function current() {
    $c = parent::current();
    return isset($c[$this->index]) ? $c[$this->index] : null;
  }
}

$a = array(
  array('page' => 'page1', 'name' => 'pagename1'),
  array('name' => '---'),
  array('page' => 'page2', 'name' => 'pagename2'),
  array('page' => 'page3', 'name' => 'pagename3')
);

$f = new Foo($a, 'page');
foreach($f as $e) {
  echo $e, "\n";
}

печатает

page1

page2
page3

Ответ 9

Я не думаю, что для этого нужна встроенная функция. В вашем массиве может быть массив.

$samples=array(
            array('page' => 'page1', 'name' => 'pagename1'),
            array('page' => 'page2', 'name' => 'pagename2'),
            array('page' => 'page3', 'name' => 'pagename3')
            );

$output1=array();
$output2=array();
foreach($samples as $sample){
    array_push($output1,$sample['name']);
    $output2[]=array_splice($sample,1);

}

print_r($output1);
print_r($output2);

в $output1 - это результат, который вы хотите, если хотите удалить только часть индексации страницы, а затем $output2.

если вам нужны все значения из этого массива и численно числится массив, вы можете использовать

$array_1=array_values($samples); 

но я понимаю, что вы этого не хотели.

Ответ 10

Это довольно простой вызов array_reduce.

$valuesOnly = array_reduce($modelData, function ($carry, $item) {
    return array_merge($carry, $item['id']);
}, []);

Ответ 11

Я хотел бы опубликовать здесь, даже если это старый вопрос, потому что он по-прежнему очень релевантен, и многие разработчики не используют PHP >= 5.5

Скажем, у вас есть такой массив:

Array
(
    [files] => Array
        (
            [name] => Array
                (
                    [0] => file 1
                    [1] => file 2
                    [2] => file 3
                )

            [size] => Array
                (
                    [0] => 1
                    [1] => 2
                    [2] => 3
                )

            [error] => Array
                (
                    [0] => abc
                    [1] => def
                    [2] => ghi
                )

        )

)

и нужный результат:

Array
(
    [0] => Array
        (
            [0] => file 1
            [1] => 1
            [2] => abc
        )

    [1] => Array
        (
            [0] => file 2
            [1] => 2
            [2] => def
        )

    [2] => Array
        (
            [0] => file 3
            [1] => 3
            [2] => ghi
        )

)

Вы можете просто использовать метод array_map() без имени функции, переданного в качестве первого параметра, например:

array_map(null, $a['files']['name'], $a['files']['size'], $a['files']['error']);

К сожалению, вы не можете сопоставлять ключи, если передаете несколько массивов.

Ответ 12

Вы имеете в виду array_values ​​?

Редактировать: Спасибо за меньшее количество комментариев. Если бы кто-то успел взглянуть на документацию для функции, вы бы увидели первый комментарий, который дает пример написания вашей собственной функции array_values_recursive. Объедините это с array_walk, и у вас будет довольно элегантная функция, в которой не будет жестко закодирован столбец "name". Sheesh.

Ответ 13

Чтобы расширить некоторые ответы здесь, начиная с PHP 5.5, array_column - это то, что вы хотите.

На самом деле это имеет несколько возможных применений.

Используя примерный массив ниже, рассмотрим различные способы использования array_column.

$a = array(
    array('id' => '1', 'name' => 'Joe'),
    array('id' => '2', 'name' => 'Jane')
);

Извлечение одного столбца в качестве массива

$b = array_column($a, 'name');

Дал бы вам. Обратите внимание на автоматические клавиши, начинающиеся с 0, в соответствии с обычным массивом.

$b[0] = 'Joe';
$b[1] = 'Jane';

Получение полного массива с столбцом в качестве индекса.

$c = array_column($a, NULL, 'id');

В результате получится следующее.

$c[1] = array('id' => '1', 'name' => 'Joe');
$c[2] = array('id' => '2', 'name' => 'Jane');

Обратите внимание, как выбранный столбец в качестве третьего параметра становится ключом для каждого элемента, и я получаю полный массив, установив второй параметр равным нулю.

Конечно, окончательное использование - установить как второй, так и третий параметры.

$d = array_column($a, 'name', 'id');

Предоставил бы вам следующее.

$d[1] = 'Joe';
$d[2] = 'Jane';

Я лично использую полные 3 параметра для создания списков опций выбора. Если у меня есть таблица с моими параметрами, я запрашиваю таблицу и получаю результат и передаю ее в это, чтобы получить список с ключом как значение и метку. Это блестящий способ создания информационных наборов, которые также должны пересекаться по индексу.