返回基于其他数组元素的多维数组值


Return multidimensional array value based on other array element

给定以下数组和给定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);