Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.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 - Fatal编程技术网

PHP-检查是否存在一个或多个数组字段

PHP-检查是否存在一个或多个数组字段,php,arrays,Php,Arrays,我有这样一个数组: array('prefix1_field' => 34, 'prefix1_anotherfield' => 345, 'prefix1_andanotherfield' => 565, 'anotherprefix_field' => 34, 'anotherprefix_anotherfield' => 345, 'anotherprefix_andanotherfield' =&

我有这样一个数组:

array('prefix1_field' => 34,
      'prefix1_anotherfield' => 345,
      'prefix1_andanotherfield' => 565,

      'anotherprefix_field' => 34,
      'anotherprefix_anotherfield' => 345,
      'anotherprefix_andanotherfield' => 565,

      'prefix3_anotherprefix_field' => 34, // <- 'anotherprefix' here should be ignored
      'prefix3_anotherfield' => 345,
      'prefix3_andanotherfield' => 565,
      ...
);
array('prefix1_字段'=>34,
“prefix1_另一个字段”=>345,
“prefix1_andanotherfield”=>565,
“另一个前缀_字段”=>34,
'anotherprefix_anotherfield'=>345,
'另一个前缀'u andanotherfield'=>565,
“prefix3\u另一个prefix\u字段”=>34,//345,
“prefix3_andanotherfield”=>565,
...
);
如何生成一个函数来检查此数组中是否有以前缀1开头的字段(例如?

类似于:

function check_array_key_prefix_exists($array, $key_prefix) {
  $keys = array_keys($array);
  foreach ($keys as $key) {
    if (0 == substr_compare($key, $key_prefix, 0, strlen($key_prefix))) {
      return true;
    }
  }

  return false;
}
function check($arr,$prefix) {
        foreach($arr as $key => $value) {
                if(strcmp(substr($key,0,strlen($prefix)),$prefix)==0) {
                        return true;
                }
        }
        return false;
}

为什么不使用正则表达式呢

function array_has_key_prefix( $array, $key_prefix ) {
  foreach($arr as $key => $value) {
    if( preg_match( "/^" . $key_prefix . "/", $key ) )
      return true;
  }
  return false;
}

我更愿意按如下方式重新构造阵列:

$data=array('prefix1'=>array(
                  'field'=>34,
                  'anotherfield'=>345,
               ),
            'prefix2'=>array(
                  'field'=>56,
               ),
……等等

使用该结构,您只需快速调用标准PHP函数array_key_exists()


有了这样的结构,你基本上就必须使用你自己的替代品来代替array_key_exists(),这将涉及到foreach()循环和explode()来将密钥分解成比特。

我不会给出太多信息,我将明确地编写类似于Dominique Roger的帖子的s.t

function check_array_key_prefix_exists($array, $key_prefix) {
  $keys = array_keys($array);
  foreach ($keys as $key) {
    if (preg_match("#^$key_prefix", $array) {
      return true;
    }
  }

  return false;
}
我不知道我是否回答了你的问题,因为我没有碰到他。
祝你好运

如果“prefix1_uu”是可变的,那么你可以避免也必须通过
If(strpos($key,$prefix)==0)来包含长度
@Fanis-尽管这会做比严格必要的更多的工作-因为它会一直寻找
prefix1_uu
,即使在
$key
的开头没有找到它
==0
获取它以查看其在该字符串中的索引是否为0,即字符串的开头。事实上,你提出了一个有趣的观点,这让我质疑我使用strpos的习惯。我确实认为
strpos()
将在整个$string中搜索$prefix,但如果它位于开头,它将立即找到它并返回(int)0。但是,如果不是,它将浪费掉整个$prefix。另一方面,substr()使用内存创建一个新变量。我认为这是可以忽略不计的。@Fanis-那么
substr\u compare
呢?哪个是最好的取决于正在搜索的子字符串和正在搜索的字符串的相对大小,以及您关心的是内存还是CPU。@Dominic right。我相信在这种情况下,两者都是可以忽略不计的,但仍然值得思考。很好的反馈。这会起作用,但对于进行简单的字符串匹配来说,这似乎是一把相当大的锤子。第一个答案很好!正则表达式最终会比strcmp()或substr_compare()慢吗?我想是的,在编译正则表达式时,比较一堆字节的相等性要比在它们上面运行正则表达式快得多。这就是说,我不是一个剖析工具-去找出!