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

时间:2014-07-10 15:53:57

标签: php

给定以下数组和给定的id,如何返回相应的elem?例如,给定id = 6,它应该返回goodby。 id值是数据库中的PK,因此始终是唯一的。

显然,我可以迭代第一个数组,检查值,并在匹配时中断并返回元素,但我希望有一个更优雅的方法来做到这一点。

array(
    array('id'=>2,'elem'=>"hello"),
    array('id'=>6,'elem'=>"goodby"),
    array('id'=>8,'elem'=>"goodnight")
);

4 个答案:

答案 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)