求教 php如何快捷判断数组中的项是单值或者是键值对? -问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

求教 php如何快捷判断数组中的项是单值或者是键值对?

2016-06-12 10:29:30 1879 1

这个是我正在试做的CSS3展开非标准属性的php
已有的输入数据如下:

<?php
     $_proprules=array( //css3兼容属性表 如无特别定义则以 -xxx- 形式附加于头部
        'animation'=>array('webkit','moz','ms'),
        'border-radius'=>array('webkit','moz','o'),
        'border-top-right-radius'=>array('webkit','moz'=>'-moz-border-radius-topright','o'),
        'border-top-left-radius'=>array('webkit','moz'=>'-moz-border-radius-topleft','o'),
        'border-bottom-right-radius'=>array('webkit','moz'=>'-moz-border-radius-bottomright','o'),
        'border-bottom-left-radius'=>array('webkit','moz'=>'-moz-border-radius-bottomleft','o'),
        'border-colour'=>array('moz'),
        'box-shadow'=>array('webkit','moz','o'),
        'transition'=>array('webkit','moz','ms','o'),
        'transform'=>array('webkit','moz','ms','o'),
        ......
    );    
     $_valuerules=array( //css3兼容值表 如无特别定义则以 -xxx- 形式附加于头部
        'linear-gradient'=>array('webkit','moz','ms','o'),
        'box'=>array('webkit','moz','o'),
        'box-shadow'=>array('webkit','moz')
        ......
    );
?>

根据以上规则对一份css文件进行处理

.container {
   box-shadow: 20px;
   transition: box-shadow 2s;
   border-top-right-radius: 4px;
   border-bottom-left-radius: 4px;
   animation: slide 1s alternate;
   background: linear-gradient(top, #e3e3e3 10%, white);
   display: box;
}

希望实现自动展开非标准属性写法

.container {
    -webkit-box-shadow: 20px;
    -moz-box-shadow: 20px;
    box-shadow: 20px;

    -webkit-transition: -webkit-box-shadow 2s;
    -moz-transition: -moz-box-shadow 2s;
    -o-transition: box-shadow 2s;
    -ms-transition: box-shadow 2s;
    transition: box-shadow 2s;

    -webkit-border-top-right-radius: 4px;
    -moz-border-radius-topright: 4px;
    border-top-right-radius: 4px;

    -webkit-border-bottom-left-radius: 4px;
    -moz-border-radius-bottom-left: 4px;
    border-bottom-left-radius: 4px;
    
    -webkit-animation: slide 1s alternate;
    -moz-animation: slide 1s alternate;
    -ms-animation: slide 1s alternate;
    animation: slide 1s alternate;

    background: -webkit-linear-gradient(top, #e3e3e3 10%, white);
    background: -moz-linear-gradient(top, #e3e3e3 10%, white);
    background: -o-linear-gradient(top, #e3e3e3 10%, white);
    background: -ms-linear-gradient(top, #e3e3e3 10%, white);
    background: linear-gradient(top, #e3e3e3 10%, white);
    
    display: -webkit-box;
    display: -moz-box;
    display: box;
}

这其中需要按照css文件的属性值对依次去检查是否存在非标准属性、非标准属性如何构成,相应的就需要从外部去判断规则数组中的键值对或者单值。

我的主要逻辑是这样的:
比如说检查css的时候到了

border-top-right-radius : 4px;

这一行,代码检查发现属性名 “border-top-right-radius” 需要 webkit、moz、o 三种兼容方式,值 4px 不参与兼容 (注:这里对值也加入判断,是因为存在一些特殊的属性比如 transition ,其属性名和值同时都要参与兼容),一共需要重复三次兼容。
然后对 webkit、moz、o 进行循环,希望从属性名规则中分别读到一下三条规则:

'webkit'=>'-webkit-border-top-right-radius',
'moz'=>'-moz-border-radius-topright',
'o'=>'-o-border-top-right-radius'

当然,由于开始在书写规则的时候使用的是简化的方案,于是在读取中就需要对 webkit、moz、o 进行判断,看这个在数组中到底是值还是键名,是键名就直接取得其值,是值就按默认规则生成需要的字符串。问题就出在这里。
在规则数组中循环,做内部判断并去css中反查在这种场景下不现实(特别是css巨大的时候)。我能想到的只有连续组合利用array_key_exists()和array_search()来验证,其中还得过滤掉单值和键值对中的值重复的情况,效率很是低下。
当然我实际在做的时候因为无从入手,于是干脆就绕过这个问题,直接用函数对这个简化书写的规则数组重新格式化了一遍(题外话,格式化的过程中还遇到了诸如 $this->$propname 这种形式的类内部属性名称引用的问题,后来强行用 & 指针解决了,但是中间遇到了巨大的疑惑,作为野生的自学党表示压力很大,下回做个例子再问)。
实际项目里算是绕过了,但是作为在写代码时遇到的问题,还是想提出来向高手们征求下看法,
如何快速地从外部去判断一个字符串在数组里的三种情况:不存在,键名,值…

取消 提交回答
全部回答(1)
  • 落地花开啦
    2019-07-17 19:33:21

    实际上你所说的单值,也是存在键的,只不过php中可以省掉按顺序存储的键名

    foreach ($a as $key => $val) {
        if (is_int($key)) {
            // 处理单值
        } else {
            // 处理键值
        }
    }
    0 0
相关问答

170

回答

惊喜翻倍:免费ECS+免费环境配置~!(ECS免费体验6个月活动3月31日结束)

豆妹 2014-10-29 17:52:21 232243浏览量 回答数 170

145

回答

【新手入门】云服务器linux使用手册

fanyue88888 2012-11-26 17:14:18 159397浏览量 回答数 145

22

回答

爬虫数据管理【问答合集】

我是管理员 2018-08-10 16:37:41 148516浏览量 回答数 22

31

回答

[@倚贤][¥20]刚学完html/css/js的新手学习servlet、jsp需要注意哪些问题?

弗洛伊德6 2018-10-27 21:52:43 147503浏览量 回答数 31

2

回答

mySQL数据库报错You have an error in your SQL syntax

落地花开啦 2016-02-14 16:09:24 133141浏览量 回答数 2

251

回答

阿里云LNAMP(Linux + Nginx + Apache + MySQL + PHP)环境一键安装脚本

云代维 2014-02-14 15:26:06 309324浏览量 回答数 251

97

回答

Redhat/CentOS一键安装web环境全攻略

xiaofanqie 2011-08-11 14:51:38 124720浏览量 回答数 97

14

回答

域名解析是正确的,但是网站打不开求助!

游客b4ezpaqg54gdq 2019-07-05 11:50:33 122096浏览量 回答数 14

11

回答

【精品问答合集】MongoDB热门问答

李博 bluemind 2019-05-29 16:50:19 122936浏览量 回答数 11

13

回答

【精品问答合集】Java热门问答

李博 bluemind 2019-05-29 16:00:45 128544浏览量 回答数 13
+关注
落地花开啦
喜欢技术,喜欢努力的人
0
文章
7824
问答
问答排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载