У меня есть массив массивов со следующей структурой:
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, eg '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 параметра для создания списков опций выбора. Если у меня есть таблица с моими параметрами, я запрашиваю таблицу и получаю результат и передаю ее в это, чтобы получить список с ключом как значение и метку. Это блестящий способ создания информационных наборов, которые также должны пересекаться по индексу.