给定以下数组和给定id,如何返回相应的元素?例如,给定id=6,它应该返回再见。id值是来自数据库的pk,因此总是唯一的。
显然,我可以只遍历第一个数组,检查值,并在匹配时中断并返回元素,但我希望有一种更优雅的方法来做到这一点。
array(
array('id'=>2,'elem'=>"hello"),
array('id'=>6,'elem'=>"goodby"),
array('id'=>8,'elem'=>"goodnight")
);
可以考虑的一种基本替代方法是收集具有array_column
(由id列索引)的列,然后解引用数组以访问传递的索引值$id
,例如:
$myArray = array(
array('id'=>2,'elem'=>"hello"),
array('id'=>6,'elem'=>"goodby"),
array('id'=>8,'elem'=>"goodnight")
);
function getValue($id, $a)
{
return array_column($a, 'elem', 'id')[$id];
}
var_dump(getValue(6, $myArray));
增强证明以获得更多控制:
function getValueAlternative($where, $get, $fromSource)
{
$where = explode("=", $where);
return array_column($fromSource, $get, $where[0])[$where[1]];
}
var_dump(getValueAlternative("id=2", "elem", $myArray));
var_dump(getValueAlternative("elem=hello", "id", $myArray));
见:
myfunction($products, $needle)
{
foreach($products as $key => $product)
{
if ( $product['id'] === $needle )
return $key;
}
return false;
}
类似:PHP多维数组搜索(查找键的特定值)
为什么不使用下面的结构?:
array(
2 => array('elem'=>"hello", ...),
6 => array('elem'=>"goodby", ...),
8 => array('elem'=>"goodnight", ...)
);
那么你可以这样访问它们:
$array[$id];
你说你已经使用PDOStatement::fetchAll()
来获得你的数组。你可以告诉fetchAll()
像我建议的那样返回一个结构,你需要使用获取模式PDO::FETCH_GROUP
:
$pdo->query('SELECT * FROM table')->fetchAll(PDO::FETCH_GROUP);
定义良好的数据结构是一个好的程序必不可少的基础。在您的情况下,将id作为键并将整个记录作为值部分的关联数组将比数字数组更好,因为它允许您执行快速的基于id的访问。当然,你必须为此付出代价——多一点内存。
您可以使用array_search
PHP函数:
/**
* @param array $array
* @param int $id
* @return string|null
*/
function getElem(array $array, $id) {
foreach($array as $subArr) {
if(($key = array_search($id, $subArr, true)) !== false) {
if(strcmp($key, "id") === 0) {
return $subArr['elem'];
}
}
}
return null;
}
$array = array(
array('id'=>2,'elem'=>"hello"),
array('id'=>6,'elem'=>"goodby"),
array('id'=>8,'elem'=>"goodnight")
);
echo getElem($array, 6);