2009-09-29 2 views
14

У меня есть массив массивов, со следующей структурой:Есть ли функция для извлечения «столбца» из массива в PHP?

array(array('page' => 'page1', 'name' => 'pagename1') 
     array('page' => 'page2', 'name' => 'pagename2') 
     array('page' => 'page3', 'name' => 'pagename3')) 

Есть встроенная функция, которая возвращает новый массив с только значениями ключей «имя»? поэтому я бы получил:

array('pagename1', 'pagename2', 'pagename3') 
+1

24 часа? Путь преждевременный. Подождите 48 часов. Это хорошо для того, чтобы позволить некоторым ответам собрать больше голосов и открыть его для еще нескольких релевантных ответов. – random

+0

Я не хочу звучать как рывок, но это не очень сложный вопрос, который через несколько дней откроет удивительное решение. – fuentesjr

ответ

17

Почему это должно быть встроенная функция? Нет, их нет, напишите сами.

Это приятный и простой, в отличие от других в этой теме.

$namearray = array(); 

foreach ($array as $item) { 
    $namearray[] = $item['name']; 
} 
+1

Хорошо, учитывая недавнее редактирование («легкий, как против других ») Я укушу;) Если вы превратите свой код в реальную функцию в соответствии с исходным запросом, он будет примерно как« сложный », как примеры' array_map() 'или' array_walk() ниже, особенно если вы хотите добавить пример выполнения. –

+0

Да, я считаю, что мои самые элегантные функции PHP и первый полный пример. :) – fuentesjr

+1

Привет, спасибо. Все, что я на самом деле задал в моем вопросе, было, если есть встроенная функция - мне не нравится изобретать велосипед. Вы дали мне ответ на это, и ваше решение в основном - то, что я написал бы. – Skilldrick

-1

Возможно, вы имели в виду array_values?

Редактировать: Спасибо за комментарий-меньше downvote. Если бы кто-то успел взглянуть на документацию для функции, вы бы увидели первый комментарий, который дает пример написания вашей собственной функции array_values_recursive. Объедините это с array_walk, и у вас будет довольно элегантная функция, в которой не будет жестко закодирован столбец «name». Sheesh.

+0

Я снова проголосовал за вас, но действительно ли это теперь стало соревнованием, чтобы придумать самое сложное решение? :) –

+0

Спасибо. :) Надеюсь, это не соревнование, просто немного раздражает, что это случается очень часто, когда я пытаюсь управлять людьми в направлении, а не выписывать решение для них. –

12

Вот функциональный способ сделать это:

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

Мне это нравится, и лямбда в нем прекрасно вписывается в мой мозг на данный момент, так как я изучаю Схему. +1 – Skilldrick

1

Аналогично решению 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); 
0

Вы можете удлините ArrayIterator class и переопределите метод 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 
0

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

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

но то, что я понимаю, вы не хотите этого.

49

По 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); 

See it in action

+0

Ницца, спасибо Джон. Я изучал PHP 5.5, но я не видел этого –

+10

. Это должен быть правильный ответ, так как php добавил встроенную функцию, которую именно то, о чем спрашивает OP. – MJoraid

1
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 и деградировать в случае функция существует

4

Ну есть. По крайней мере для 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; 
    } 
} 
1

Да, есть PHP встроенная функция называется array_column, который делает то, что вы ищете.

Вы бы назвали это что-то вроде $name_keys = array_column($array, 'name');, чтобы получить результат, который вы ищете.

Пожалуйста, обратитесь к следующей записи в PHP инструкции для более подробной информации:

http://php.net/manual/en/function.array-column.php

+0

Спасибо, что он дал полный ответ. – Dinesh

+1

Этот ответ действителен только в том случае, если версия PHP больше 5. – Dinesh

+0

Больше, чем 5.5, если быть точным. – cytsunny

0

Это довольно простой вызов array_reduce.

$valuesOnly = array_reduce($modelData, function ($carry, $item) { 
    return array_merge($carry, $item['id']); 
}, []); 
-1

Просто для того, чтобы расширить некоторые ответы здесь, начиная с 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.

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

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

Дало бы вам следующее.

$d[1] = 'Joe'; 
$d[2] = 'Jane'; 

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

0

Я хотел разместить здесь, даже если это старый вопрос, потому что он по-прежнему очень актуальна и многие разработчики не используют 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']); 

К сожалению, вы не можете сопоставлять ключи, если передаете несколько массивов.

Смежные вопросы