Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用键从多维数组中获取值(复数)_Php - Fatal编程技术网

Php 使用键从多维数组中获取值(复数)

Php 使用键从多维数组中获取值(复数),php,Php,我知道关键,现在我需要搜索5000多个用户数据库时产生的所有结果。任何用户都可以没有、一个或多个位置,由id和name字段标识。因此,我需要数组中的结果,不仅仅是第一个/最后一个,而是所有结果。下面是一个用户示例(实际阵列设置,假数据;) $matches = array(); function find_array_values($haystack, $needle) { global $matches; $collection = array(); foreac

我知道关键,现在我需要搜索5000多个用户数据库时产生的所有结果。任何用户都可以没有、一个或多个位置,由
id
name
字段标识。因此,我需要数组中的结果,不仅仅是第一个/最后一个,而是所有结果。下面是一个用户示例(实际阵列设置,假数据;)

$matches = array();

function find_array_values($haystack, $needle)
{

    global $matches;
    $collection = array();

    foreach($haystack AS $key => $value)
    {
        if($key === $needle)
        {
            $matches[] = $value;
        }
        else if(is_array($value))
        {
           find_array_values($value, $needle);
        }
    }
}

find_array_values($array, 'location');
print_r($matches);
?>
你可以看出,这家伙在他的facebook数据中有一个位置,但其他位置包括相同的
[location]=>数组([id]=>123[name]=>SomePlace)
,例如
[work]
[education]
,或,或

我尝试过一个递归函数,如:

如何修改上述函数以返回位置数组数组?这个函数返回第一个用户的上述数据,该用户包含一个位置,而不是位置本身或位置数组

编辑:
$matches = array();

function find_array_values($haystack, $needle)
{

    global $matches;
    $collection = array();

    foreach($haystack AS $key => $value)
    {
        if($key === $needle)
        {
            $matches[] = $value;
        }
        else if(is_array($value))
        {
           find_array_values($value, $needle);
        }
    }
}

find_array_values($array, 'location');
print_r($matches);
?>
因此,我需要的是这样的东西:

Array(
    [0] => Array(
         [id] => 1234567890
         [name] => GreatCity, World
        )
    [1] => Array(
         [id] => 2345678901
         [name] => SomeCity, Blop
        )
    [2] => Array(
         [id] => 3456789012
         [name] => AnotherCity, Boo
        )
)
根据答案进行编辑
$matches = array();

function find_array_values($haystack, $needle)
{

    global $matches;
    $collection = array();

    foreach($haystack AS $key => $value)
    {
        if($key === $needle)
        {
            $matches[] = $value;
        }
        else if(is_array($value))
        {
           find_array_values($value, $needle);
        }
    }
}

find_array_values($array, 'location');
print_r($matches);
?>
Thomas David Plat的回答给出了正确的结果,但仍然是一个不太有用的数据结构。如何将结果从结构中取出并放入上面的编辑中

David回答的结果:

Array
(
[0] => Array
    (
        [0] => Array
            (
                [0] => Array
                    (
                        [id] => 108276092536515
                        [name] => Arnhem, Netherlands
                    )
                [1] => Array()
            )
    )
[1] => Array
    (
        [0] => Array
            (
                [0] => Array
                    (
                        [id] => 108276092536515
                        [name] => Arnhem, Netherlands
                    )
                [1] => Array()
            )
    )
[2] => Array()

[3] => Array()

[4] => Array()
我尝试了
array\u filter
array\u map
array\u values
和其他类似的变体,如下所示:

 $locations = array_map( 'array_filter', find_array_values( $users, 'location' ));

但是结构似乎保持不变…

您可以像这样修改阵列的位置部分

[location] => Array
        (
            [work]=> Array(
                 [id] => 108276092536515
                  [name] => Arnhem, Netherlands
             )
             [home] => Array(
                 [id] => 108276092536515
                  [name] => Arnhem, Somewhere else
             )
        )

如果这样修改数组,则函数将返回位置数组

更新的答案
$matches = array();

function find_array_values($haystack, $needle)
{

    global $matches;
    $collection = array();

    foreach($haystack AS $key => $value)
    {
        if($key === $needle)
        {
            $matches[] = $value;
        }
        else if(is_array($value))
        {
           find_array_values($value, $needle);
        }
    }
}

find_array_values($array, 'location');
print_r($matches);
?>
这会起作用,但正如我在评论中所说的,这是一种糟糕的做法,因为它使用了全局关键字。如果将此函数作为方法实现到类中,则可以使用类变量,而不是使用global关键字,这将是一个简洁的解决方案

旧答案

$matches = array();

function find_array_values($haystack, $needle)
{

    global $matches;
    $collection = array();

    foreach($haystack AS $key => $value)
    {
        if($key === $needle)
        {
            $matches[] = $value;
        }
        else if(is_array($value))
        {
           find_array_values($value, $needle);
        }
    }
}

find_array_values($array, 'location');
print_r($matches);
?>
function find_array_values($haystack, $needle)
{
    $collection = array();

    foreach($haystack AS $key => $value)
    {
        if($key === $needle)
        {
            $collection[] = $value;
        }
        else if(is_array($value))
        {
           $collection[] = find_array_values($value, $needle);
        }
    }

    return $collection;

}

echo "<pre>";
print_r(find_array_values($users, 'location'));
echo "</pre>";
函数查找数组值($haystack,$needle)
{
$collection=array();
foreach($key=>$value的haystack)
{
如果($key==$pinder)
{
$collection[]=$value;
}
else if(是_数组($value))
{
$collection[]=查找数组值($value,$needle);
}
}
退回$collection;
}
回声“;
打印(查找数组值($users,'location');
回声“;
给你。只需将用户数组传递到函数中。该函数将返回一个位置数组


有一个限制。该功能不会搜索位置内的槽位置。

Awesome!几乎就是我要找的;)它似乎删除了所有其他值,保留了原始数组的完整结构<代码>[6]=>Array([0]=>Array([0]=>Array()[1]=>Array([id]=>11510688850166[name]=>Tilburg,荷兰)[2]=>Array([0]=>Array()[1]=>Array())。你不会碰巧也有这个问题的解决方案吗?我刚刚尝试了大约1.5个小时,但如果不使用全局变量,我就无法得到一个解决方案,这是一个糟糕的做法。我希望其他人可以把最后一部分放在一起,因为我现在也对这个问题非常感兴趣。谢谢你的帮助。我一直在努力解决这个问题从今天早上开始5个小时了,我很想让它工作。顺便说一句,你是如何使用“坏习惯”的?对我来说,坏习惯并不重要,因为它是一个一次性的项目,将数据库和数据合并到1中,然后删除所有这些代码来创建一个实时系统。最后一个系统是安全性和良好的协同工作的系统我更新了我的答案:)看一看。我还添加了一个更好的练习建议。这是一个很棒的答案!:)非常感谢!(如果我需要对实时数据进行类似的操作,我会纠正这种错误做法)您是否意识到,当我提到5000多条记录时(仅在这个数据库中,以后还会有更多记录),不能“更改”位置部分,对吗?此外,从代码中可以看出,这是Facebook数据,在结构中,它存储为从Facebook应用程序接收的数据,因此更改位置也不是我的事;)