Web

Есть ли функция для извлечения «столбца» из массива в 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'];

}

 

В некоторых случаях, когда ключи не названы, вы можете вместо этого сделать что-то вроде такого:

$namearray = array();

foreach ($array as $key => $value) {

    $namearray [] = $value;

}

 

Ответ 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

Что ж, такая функция есть. По крайней мере, для PHP> 5.5.0, и называется она array_column.

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

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

 

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

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;

    }

}

 

Ответ 4

Подобно предыдущему решению, но немного более универсально с использованием array_walk() с настраиваемым обратным вызовом:

// функция обратного вызова

function extract_named_sub_elements(&$item, $key, $name) {

  $item = $item[$name];

}

// тестовые данные

$original = array(

  array('page' => 'page1', 'name' => 'pagename1'),

  array('page' => 'page2', 'name' => 'pagename2'),

  array('page' => 'page3', 'name' => 'pagename3'),

);

// Использует копию, так как array_walk() работает непосредственно с переданным массивом

$copy = $original;

// Замените 'name' на любой элемент, который вы хотите извлечь, например, 'page'

array_walk($copy, 'extract_named_sub_elements', 'name');

print_r($copy);

 

Ответ 5

Вы можете расширить класс 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

 

Ответ 6

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

$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); 

 

Ответ 7

Чтобы расширить некоторые ответы здесь, начиная с 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');

 

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

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

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

 

В результате:

$d[1] = 'Joe';

$d[2] = 'Jane';

 

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

Схожие статьи

Web

Можно ли использовать пул демонов кэша памяти для более эффективного совместного использования сеансов?

Web

Как удалить Apache с помощью командной строки? Как удалить в Windows 8?

Web

Как получить значения из выпадающего меню с помощью PHP

Чек-листы оптимизации сайта, продвижения сайта и готовности к запуску
Web

Чек-листы оптимизации сайта, продвижения сайта и готовности к запуску