У меня есть массив массивов со следующей структурой:
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