Ответ 1
Почему это должна быть встроенная функция? Нет, их нет, напишите сами.
Вот хороший и легкий, в отличие от других в этой теме.
$namearray = array();
foreach ($array as $item) {
$namearray[] = $item['name'];
}
У меня есть массив массивов со следующей структурой:
array(array('page' => 'page1', 'name' => 'pagename1')
array('page' => 'page2', 'name' => 'pagename2')
array('page' => 'page3', 'name' => 'pagename3'))
Есть ли встроенная функция, которая вернет новый массив только с значениями ключей 'name'? поэтому я бы получил:
array('pagename1', 'pagename2', 'pagename3')
Почему это должна быть встроенная функция? Нет, их нет, напишите сами.
Вот хороший и легкий, в отличие от других в этой теме.
$namearray = array();
foreach ($array as $item) {
$namearray[] = $item['name'];
}
По 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);
Вот функциональный способ:
$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);
Хорошо. По крайней мере, для 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;
}
}
Похож на решение 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);
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 и деградировать в случае существования функции
Да, есть встроенная функция php, называемая array_column, которая делает то, что вы ищете.
Вы бы назвали это чем-то вроде $name_keys = array_column($array, 'name');
, чтобы получить результат, который вы ищете.
Для получения дополнительной информации обратитесь к следующей записи в руководстве по PHP:
Вы можете расширить класс 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
Я не думаю, что для этого нужна встроенная функция. В вашем массиве может быть массив.
$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);
но я понимаю, что вы этого не хотели.
Это довольно простой вызов array_reduce.
$valuesOnly = array_reduce($modelData, function ($carry, $item) {
return array_merge($carry, $item['id']);
}, []);
Я хотел бы опубликовать здесь, даже если это старый вопрос, потому что он по-прежнему очень релевантен, и многие разработчики не используют 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']);
К сожалению, вы не можете сопоставлять ключи, если передаете несколько массивов.
Вы имеете в виду array_values ?
Редактировать: Спасибо за меньшее количество комментариев. Если бы кто-то успел взглянуть на документацию для функции, вы бы увидели первый комментарий, который дает пример написания вашей собственной функции array_values_recursive. Объедините это с array_walk, и у вас будет довольно элегантная функция, в которой не будет жестко закодирован столбец "name". Sheesh.
Чтобы расширить некоторые ответы здесь, начиная с 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 параметра для создания списков опций выбора. Если у меня есть таблица с моими параметрами, я запрашиваю таблицу и получаю результат и передаю ее в это, чтобы получить список с ключом как значение и метку. Это блестящий способ создания информационных наборов, которые также должны пересекаться по индексу.