给定以下数组和给定的id,如何返回相应的elem?例如,给定id = 6,它应该返回goodby。 id值是数据库中的PK,因此始终是唯一的。
显然,我可以迭代第一个数组,检查值,并在匹配时中断并返回元素,但我希望有一个更优雅的方法来做到这一点。
array(
array('id'=>2,'elem'=>"hello"),
array('id'=>6,'elem'=>"goodby"),
array('id'=>8,'elem'=>"goodnight")
);
答案 0 :(得分:1)
要考虑的基本替代方法是使用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));
答案 1 :(得分:0)
为什么不使用以下结构?:
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的快速访问。当然,你需要为此付出代价 - 带点内存。
答案 2 :(得分:0)
您可以使用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);
答案 3 :(得分:0)
见:
myfunction($products, $needle)
{
foreach($products as $key => $product)
{
if ( $product['id'] === $needle )
return $key;
}
return false;
}
类似:PHP Multidimensional Array Searching (Find key by specific value)