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

Как и где устанавливается $ _SERVER ['APP_DEBUG'] в Symfony >= 5.1?

Как и на чём лучше писать сайты?
Web

Как и на чём лучше писать сайты?

Как бесплатно проверить доступность сайта из разных частей мира?
Web

Как бесплатно проверить доступность сайта из разных частей мира?

Сравнение VPN-сервисов: выбираем лучший по нескольким критериям
Web

Сравнение VPN-сервисов: выбираем лучший по нескольким критериям

×