Я уверен, что этот вопрос был задан раньше, мои извинения за то, что он не нашел его первым.
Исходный массив:
[0] => Array ( [categoryId] => 1 [eventId] => 2 [eventName] => 3 [vendorName] => 4 ) [1] => Array ( [categoryId] => 5 [eventId] => 6 [eventName] => 7 [vendorName] => 8 ) [2] => Array ( [categoryId] => 9 [eventId] => 10 [eventName] => 11 [vendorName] => 12 )
Я надеялся на результат из: print_r (get_values_from_a_key_in_arrays ('categoryId', $ array));
[0] => 1 [1] => 5 [2] => 9
Я просто ищу что-то более чистое, чем писать свою собственную функцию foreach. Если foreach – ответ, у меня уже есть это на месте.
Изменить: я не хочу использовать жестко закодированный ключ, я просто показывал пример вызова решения. Благодаря! ^ _ ^
Quick Grab Solution для PHP 5.3:
private function pluck($key, $data) { return array_reduce($data, function($result, $array) use($key) { isset($array[$key]) && $result[] = $array[$key]; return $result; }, array()); }
Итак, классная вещь о функциях сбора / итератора более высокого порядка, таких как pluck , filter , each , map и friends, заключается в том, что их можно смешивать и сопоставлять, чтобы составить более сложный набор операций.
Большинство языков предоставляют эти типы функций (ищите пакеты, такие как сбор, итератор или перечисление / перечисляемые) … некоторые предоставляют больше функций, чем другие, и вы обычно увидите, что функции называются по-разному на разных языках (например, collect == map, уменьшить = раз). Если функция не существует на вашем языке, вы можете создать ее из тех, которые существуют.
Что касается вашего тестового примера … мы можем использовать array_reduce для реализации pluck . Первая версия, которую я написал, основывалась на array_map
; однако я согласен с @salathe, что array_reduce более краток для этой задачи; array_map является опцией OK, но в конечном итоге вам придется больше работать. array_reduce
может выглядеть немного странно, но если обратный вызов аккуратно организован, все хорошо.
Менее наивный pluck
также проверяет, может ли он «называть» (функция / метод) на итерированное значение. В наивной реализации ниже мы предполагаем, что структура является хешем (ассоциативный массив).
Это позволит настроить тестовые данные (светильники):
<?php $data[] = array('categoryId' => 1, 'eventId' => 2, 'eventName' => 3, 'vendorName' => 4); $data[] = array('categoryId' => 5, 'eventId' => 6, 'eventName' => 7, 'vendorName' => 8); $data[] = array('categoryId' => 9, 'eventId' => 10, 'eventName' => 11, 'vendorName' => 12); $data[] = array(/* no categoryId */ 'eventId' => 10, 'eventName' => 11, 'vendorName' => 12); $data[] = array('categoryId' => false,'eventId' => 10, 'eventName' => 11, 'vendorName' => 12); $data[] = array('categoryId' => 0.0, 'eventId' => 10, 'eventName' => 11, 'vendorName' => 12);
Выберите версию, которую вы предпочтете
$preferredPluck = 'pluck_array_reduce'; // or pluck_array_map
«pluck» для PHP 5.3+: array_reduce обеспечивает краткую реализацию, хотя не так легко рассуждать, как версия array_map:
function pluck_array_reduce($key, $data) { return array_reduce($data, function($result, $array) use($key){ isset($array[$key]) && $result[] = $array[$key]; return $result; }, array()); }
«pluck» для PHP 5.3+: array_map не подходит для этого, поэтому нам нужно делать больше проверок (и он по-прежнему не учитывает многие потенциальные случаи):
function pluck_array_map($key, $data) { $map = array_map(function($array) use($key){ return isset($array[$key]) ? $array[$key] : null; }, $data); // is_scalar isn't perfect; to make this right for you, you may have to adjust return array_filter($map, 'is_scalar'); }
«выщипывать» для устаревшего PHP <5.3
Мы могли бы использовать устаревшую функцию create_function ; однако, это плохая форма, не рекомендуется, а также совсем не изящная, поэтому я решил не показывать ее.
function pluck_compat($key, $data) { $map = array(); foreach ($data as $array) { if (array_key_exists($key, $array)) { $map[] = $array[$key]; } } unset($array); return $map; }
сfunction pluck_compat($key, $data) { $map = array(); foreach ($data as $array) { if (array_key_exists($key, $array)) { $map[] = $array[$key]; } } unset($array); return $map; }
Здесь мы выбираем версию «pluck» для вызова на основе версии PHP, которую мы запускаем. Если вы запускаете весь скрипт, вы должны получить правильный ответ независимо от того, в какой версии вы находитесь.
$actual = version_compare(PHP_VERSION, '5.3.0', '>=') ? $preferredPluck('categoryId', $data) : pluck_compat('categoryId', $data); $expected = array(1, 5, 9, false, 0.0); $variance = count(array_diff($expected, $actual)); var_dump($expected, $actual); echo PHP_EOL; echo 'variance: ', $variance, PHP_EOL; print @assert($variance) ? 'Assertion Failed' : 'Assertion Passed';
Обратите внимание, что нет конца «?>». Это потому, что это не нужно. Более хорошее может состоять в том, чтобы оставить его, чем от его хранения.
FWIW, похоже, что это добавляется к PHP 5.5 как array_column .
Картирование – это то, что вам нужно:
$input = array( array( 'categoryId' => 1, 'eventId' => 2, 'eventName' => 3, 'vendorName' => 4, ), array( 'categoryId' => 5, 'eventId' => 6, 'eventName' => 7, 'vendorName' => 8, ), array( 'categoryId' => 9, 'eventId' => 10, 'eventName' => 11, 'vendorName' => 12, ), ); $result = array_map(function($val){ return $val['categoryId']; }, $input);
Или создать нужную функцию:
function get_values_from_a_key_in_arrays($key, $input){ return array_map(function($val) use ($key) { return $val[$key]; }, $input); };
а затем используя его:
$result = get_values_from_a_key_in_arrays('categoryId', $array);
Он будет работать в PHP> = 5.3, где разрешены анонимные обратные вызовы. Для более ранних версий вам нужно будет определить обратный вызов раньше и передать его имя вместо анонимной функции.
Для этого нет встроенной функции, но ее обычно называют « срывом ».
<?php $a = array( array('a' => 1, 'b' => 2), array('a' => 2, 'b' => 2), array('a' => 3, 'b' => 2), array('a' => 4, 'b' => 2) ); function get_a($v) { return $v['a']; } var_dump(array_map('get_a', $a));
Вы можете использовать функцию create_function или анонимную функцию (PHP 5.3> =)
<?php $a = array( array('a' => 1, 'b' => 2), array('a' => 2, 'b' => 2), array('a' => 3, 'b' => 2), array('a' => 4, 'b' => 2) ); var_dump(array_map(create_function('$v', 'return $v["a"];'), $a));
Я бы написал функцию обратного вызова, как описано выше, а затем использовал ее с array_map.
Нет встроенной функции. Но с помощью array_map()
легко сделать array_map()
.
$array = array( array( "categoryID" => 1, "CategoryName" => 2, "EventName" => 3, "VendorName" => 4 ), array( "categoryID" => 5, "CategoryName" => 6, "EventName" => 7, "VendorName" => 8 ), array( "categoryID" => 9, "CategoryName" => 10, "EventName" => 11, "VendorName" => 12 ) ); $newArray = array_map(function($el) { return $el["categoryID"]; }, $array); var_dump($newArray);
Где lisp, когда вам это нужно? На самом деле в php тоже довольно легко управлять. Просто используйте функцию array_map, как показано ниже.
# bunch o data $data = array(); $data[0] = array("id" => 100, "name" => 'ted'); $data[1] = array("id" => 200, "name" => 'mac'); $data[2] = array("id" => 204, "name" => 'bub'); # what you want to do to each bit of it function pick($n) { return($n['id']); } # what you get after you do that $map = array_map("pick", $data); # see for yourself print_r($map);
Начиная с PHP 5.5, используйте array_column
:
$events = [ [ 'categoryId' => 1, 'eventId' => 2, 'eventName' => 3, 'vendorName' => 4 ], [ 'categoryId' => 5, 'eventId' => 6, 'eventName' => 7, 'vendorName' => 8 ], [ 'categoryId' => 9, 'eventId' => 10, 'eventName' => 11, 'vendorName' => 12 ], ]; print_r(array_column($events, 'categoryId'));
Посмотрите его онлайн на 3v4l.
Для версий до 5.5 вы можете использовать полиполк .
Вы можете использовать array_filter и передать функцию на основе желаемого ключа.
Однако ответ Тадека лучше.