Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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_Arrays_Multidimensional Array_Unset - Fatal编程技术网

Php 使用一个数组过滤另一个数组的结果,两者都是多维的

Php 使用一个数组过滤另一个数组的结果,两者都是多维的,php,arrays,multidimensional-array,unset,Php,Arrays,Multidimensional Array,Unset,我从数据中提取一个数组,从API中提取一个数组 API阵列1 ... [71] => Array ( [id] => integer [name] => example_name [logo] => url_of_image [lang] => en ) ... 数据库API array2 ... Array( [0] =

我从数据中提取一个数组,从API中提取一个数组

API阵列1

...
[71] => Array
        (
            [id] => integer
            [name] => example_name
            [logo] => url_of_image
            [lang] => en
        )
...
数据库API array2

    ...
Array(
    [0] => integer
    [1] => integer
}
    ...
我想使用array2查找array1中ID的任何实例,如果它们存在,则取消设置密钥

数组差异不适用于多维。 没有一个公共密钥 这些值是动态的,所以我不能硬编码它们 数组筛选器不会接受多个命令,执行foreach会导致错误

注意:中的数组到字符串转换

PHP5.6

foreach($array2 as $key => $value) {
   foreach($array1 as $key1 => $value1) {
      if ($value1 == $value) {
         unset($arrat2[$key])
      }
   }
}
我把它埋在某个地方,过滤掉我认为可以在函数中插入foreach的语言,但这会引发数组到字符串的转换

$filtered = array();
                    $filtered = array_filter($array1, function($el) { return ($el['lang'] == "en"); });
比如:

        $result = array();
            foreach($array2 as $value) {
                $result = array_filter($array1, function($ee) { return ($ee['id'] != $value); });
            }
结果:

注意:未定义变量:值i

变量转储数组2:

array(2) {
  [0]=>
  array(1) {
    ["id"]=>
    string(8) "random integer"
  }
  [1]=>
  array(1) {
    ["id"]=>
    string(9) "random integer"
  }
}
变量转储数组1:

array(151) {
  [0]=>
  array(4) {
    ["id"]=>
    int(integer 1)
    ["name"]=>
    string(7) "example name 1"
    ["logo"]=>
    string(97) "image1.png"
    ["lang"]=>
    string(2) "en"
  }
  [1]=>
  array(4) {
    ["id"]=>
    int(integer 2)
    ["name"]=>
    string(10) "example name 2"
    ["logo"]=>
    string(100) "image2.png"
    ["lang"]=>
    string(2) "en"
  }
  [2]=>
  array(4) {
    ["id"]=>
    int(integer 3)
    ["name"]=>
    string(9) "example name 3"
    ["logo"]=>
    string(99) "image3.png"
    ["lang"]=>
    string(2) "en"
  }

回答得很好,还必须确保我的两个值都是被比较的整数。

我想你的循环太多了。循环遍历要从中取消设置密钥的数组,并针对第二个数组测试每个值

FOREACH ($array2){
$test_array[] = $id;
}
FOREACH ( $array1 AS $key => $array3){
  IF ( in_array($array3['id'],$test_array) ) {
    unset($array1[$key]);
  }
}

根据您要执行的操作,这可能有助于您在$array2中每行提供一个以上的筛选器,行被OR'ed,而一行中的多个条件被AND'ed:

<?php

$array1 = array(
    array(
        "id" => 1,
        "name" => "foo",
        "logo" => "foo-logo.png",
        "lang" => "es"
    ),
    array(
        "id" => 3,
        "name" => "bar",
        "logo" => "bar-logo.png",
        "lang" => "en"
    ),
    array(
        "id" => 7,
        "name" => "xyz",
        "logo" => "xyz-logo.png",
        "lang" => "it"
    ),
    array(
        "id" => 15,
        "name" => "aaa",
        "logo" => "aaa-logo.png",
        "lang" => "it"
    ),
    array(
        "id" => 23,
        "name" => "aaa",
        "logo" => "aaa-logo.png",
        "lang" => "es"
    ),
);

// Filter out entries with id #7 OR lang = en OR (name = "aaa" AND lang = "es")
$array2 = array(
    array("id" => 7),
    array("lang" => "en"),
    array("name" => "aaa", "lang" => "es")
);

echo "<pre>";

$filtered = array_filter($array1, function($e) use ($array2)
{
    foreach($array2 as $filters)
    {
        $doFilter = true;
        foreach($filters as $k => $v)
        {
            if (isset($e[$k]) && $e[$k] !== $v) {
                $doFilter = false;
                break;
            }
        }
        if ($doFilter)
        {
            return false;
        }
    }
    return true;
});

var_dump($filtered);

展示你的foreach,我不明白如果你做得正确,为什么这种方法不起作用。为什么数组过滤器不起作用?您提供决定元素是否被抛出的回调。@Rasclatt我知道我肯定做错了,更新的帖子。所以我在这里的其他地方遇到了这个问题,这给我带来了一个括号错误,即使我所有的括号正确打开和关闭都没有得到1对多或1太短。[17-Jan-2017 20:31:01 America/Toronto]PHP解析错误:语法错误,第100行的//search.PHP中意外的“{”是未设置的行。@Keelan我是否正确理解您没有array1['id'],但您的id本身就是变量……例如,array1['id_this']=5;将匹配并取消设置array2['id_this']=5;?array1携带多维数组,每个数组至少包含一个id。我在数据库中存储了一些id,并将其检索到数组中。我希望这些id在array1中搜索并取消设置键。id键在数组中很常见。@Keelan因此,当$array1[$key]['id]的值是否等于$array2[]内的任何整数?是的,但是我发现array2内的值不是整数,所以我的问题的这一部分很难解决。我想这是因为我的id是这样排列的:数组[0]=>Array[id]=>32007412[1]=>Array[id]=>131877902这正是我的array2的结构,错误是什么?不抛出错误,只是不过滤任何东西。你能卸载你的数组吗?输入/$array1和过滤器/$array2在我的情况下,至少有一小部分会有帮助。更新的主帖数组1和数组2中的第一个结果都是相同的整数ID,是因为数组2是字符串不是整数?
array(2) {
  [0]=>
  array(4) {
    ["id"]=>
    int(1)
    ["name"]=>
    string(3) "foo"
    ["logo"]=>
    string(12) "foo-logo.png"
    ["lang"]=>
    string(2) "es"
  }
  [3]=>
  array(4) {
    ["id"]=>
    int(15)
    ["name"]=>
    string(3) "aaa"
    ["logo"]=>
    string(12) "aaa-logo.png"
    ["lang"]=>
    string(2) "it"
  }
}