【问题标题】:Search and retrieve from multidimensional array PHP从多维数组 PHP 中搜索和检索
【发布时间】:2018-10-26 07:46:28
【问题描述】:

我在 PHP 中有一个多维数组,我试图搜索一个特定的值 (url),然后检索一个关联的值 (value)。如果没有找到我也需要转移到else。

array(2) { 
  [0]=> array(2) { 
    ["url"]=> string(7) "fareham" 
    ["value"]=> string(7) "Fareham" 
  } 

 [1]=> array(2) { 
    ["url"]=> string(11) "southampton" 
    ["value"]=> string(11) "Southampton" 
  } 
}

我一直在尝试使用 array_key_exists 和 isset 来检查它是否已设置并且只是为空!任何有关执行此操作的最佳实践的指针都会非常感激。

【问题讨论】:

标签: php arrays


【解决方案1】:

使用array_column()按url列索引数据,然后使用isset()检查值是否存在...

$data = array_column($data, "value", "url");
$search = 'southampton';

$value = isset($data[$search])?$data[$search]:"not found";

echo $value;

或者对于 PHP 7+,您可以使用 null coalescing operator (??)

$value = $data[$search]??"not found";

【讨论】:

  • 太棒了,谢谢你奈杰尔!我在想这一切都错了。我认为需要更多关于那些内置数组函数的学习!再次感谢您。
  • 伙计,我总是忘记数组列的第三个参数,哈哈
  • 这里我为你缩短了它(在 PHP7 中)echo array_column($a, "value", "url")['southampton'] ?? "not found";
【解决方案2】:

这是最简单的方法(不检查)

$a = array (
    0 => 
    array (
        "url" => 'fareham',
        "value" => 'Fareham'
    ),
    1 => 
    array (
        "url" => 'southampton',
        "value" => 'Southampton'
    )
);

$u = 'fareham';
$i = $a[false===($f=array_search($u,array_column($a,'url')))?-1:$f]['value'];
print_r($i);

输出

Fareham

Sandbox

工作原理

首先我们创建一个数组,我们可以使用 array_column 在我们想要搜索的列上搜索 url。看起来像这样[0=>'fareham', 1=>'southampton']

然后我们使用返回索引的普通 array_search,如果您注意到上面的索引与原始数组相关。这意味着我们可以将它作为顶级键放入,然后添加我们想要的键是一件简单的事情。

因为 array_search 可以返回一个布尔值(false),PHP 将其视为 0 或第一个索引,我为此做了一些修改。但更好的方法是像这样检查它: $a = 数组 ( 0 => 大批 ( "url" => 'fareham', "价值" => '法勒姆', “额外” => 'Foo' ), 1 => 大批 ( "url" => '南安普顿', "价值" => '南安普顿', “额外” => '酒吧' ) );

function serchMultiDimensionalValue($needle, $haystack, $fields='value'){
   if(false === ($f=array_search($needle,array_column($haystack,'url')))) return false; //or return [];

   if(!is_array($fields)) $fields = [$fields];

   return array_intersect_key($haystack[$f], array_flip($fields));
}


var_dump(serchMultiDimensionalValue('foo',$a));
var_dump(serchMultiDimensionalValue('fareham',$a));
var_dump(serchMultiDimensionalValue('fareham',$a, 'extra'));
var_dump(serchMultiDimensionalValue('fareham',$a, ['extra','url']));

输出

bool(false)
array(1) {
  ["value"]=>
  string(7) "Fareham"
}
array(1) {
  ["extra"]=>
  string(3) "Foo"
}
array(2) {
  ["url"]=>
  string(7) "fareham"
  ["extra"]=>
  string(3) "Foo"
}

Sandbox

我给它增加了一点“功能”,希望你不要介意。

【讨论】:

  • no checks - 表示它没有检查布尔值是否为假。
  • 我已经为你修复了它...... :-/ 我在考虑 Javascript,因为它会为丢失的项目返回 -1。 ...大声笑
猜你喜欢
  • 1970-01-01
  • 2014-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-15
  • 2016-09-19
  • 2017-03-23
  • 1970-01-01
相关资源
最近更新 更多