在PHP中,有一个返回由来自关联数组的阵列的键的值的阵列的功能?(In PHP, is there

2019-06-24 14:33发布

我敢肯定,这个问题已经被问过,我的道歉不是第一次发现它。

原数组:

[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',$阵列));

[0] => 1
[1] => 5
[2] => 9

我只是在寻找的东西比我自己写的foreach基于函数干净。 如果是的foreach的答案,我已经到位。

编辑:我不想使用硬编码的关键,我只是带一个例子调用解决方案。 谢谢! ^ _ ^

对于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());
}

Answer 1:

因此,有关很酷的事情高阶 收集/迭代器的功能 ,如动物内脏 , 过滤器 , 每一个 , 地图 ,和朋友们的是,他们可以混合和匹配,谱写出更加复杂的操作。

大多数语言提供这些类型的函数(看起来像采集,迭代器,或枚举包/枚举)......一些提供比别人更多的功能,你会经常看到,功能不同的跨语言命名(即收集==地图,减少==倍)。 如果一个函数没有在你的语言存在,你可以创建它从确实存在的人。

至于你的测试用例......我们可以用array_reduce实现采摘 。 我发布的第一个版本依靠array_map ; 不过,我同意@salathe认为array_reduce是这个任务更加简洁; array_map是一个不错的选择,但最终不得不在年底做更多的工作。 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

“采摘”为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());
}

“采摘”为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;
}

这里我们选择其中一个版本的“采摘”基于我们正在运行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 。



Answer 2:

映射是你所需要的:

$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,其中匿名回调被允许工作。 对于早期版本,你需要回调早期定义和传递,而不是匿名函数的名称。



Answer 3:

有这个没有内置的功能,但它通常被称为“ 采摘 ”。



Answer 4:

<?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使用它。



Answer 5:

有没有内置的功能。 但一个很容易与制作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);


Answer 6:

哪里是口齿不清,当你需要它吗? 其实在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);


Answer 7:

由于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之前的版本中,您可以考虑使用填充工具 。



Answer 8:

你可以使用array_filter ,并通过基于所需的键的功能。

Tadeck的回答是更好的方式,但。



文章来源: In PHP, is there a function that returns an array made up of the value of a key from an array of associative arrays?