【问题标题】:How to search a PHP array and create unique variables if results present?如果结果存在,如何搜索 PHP 数组并创建唯一变量?
【发布时间】:2020-12-19 17:24:50
【问题描述】:

我有一个基于到达客人的动态 PHP 生成数组 ($mapHitArriving),结果如下:

[0] => Array
    (
        [id] => 1098
        [source] => 31
        [name] => Steve test1
        [date] => 2020-12-19
        [dateLast] => 2020-12-20
        [cost] => 250
        [unitno] => 1
        [utitle] => Queen Plus Room
    )

[1] => Array
    (
        [id] => 1099
        [source] => 31
        [name] => Steve Test2
        [date] => 2020-12-19
        [dateLast] => 2020-12-20
        [cost] => 250
        [unitno] => 3
        [utitle] => Queen Plus Room
    )
    

如果 [unitno] 存在,我正在尝试分配变量。该变量基于单元号,并且具有单元号的值和一个并列的“a”,因为我们的目标是到达的客人。研究让我考虑使用 array_search 并定位“unitno”的索引列。

使用以下只会产生 1 个结果。仅创建 unit3 的变量。

if(array_search(1,array_column($mapHitArriving, 'unitno'))== TRUE) { $unit1 = '1a'; };
if(array_search(2,array_column($mapHitArriving, 'unitno'))== TRUE) { $unit2 = '2a'; };
if(array_search(3,array_column($mapHitArriving, 'unitno'))== TRUE) { $unit3 = '3a'; };
if(array_search(4,array_column($mapHitArriving, 'unitno'))== TRUE) { $unit4 = '4a'; };
if(array_search(5,array_column($mapHitArriving, 'unitno'))== TRUE) { $unit5 = '5a'; };
if(array_search(6,array_column($mapHitArriving, 'unitno'))== TRUE) { $unit6 = '6a'; };
if(array_search(7,array_column($mapHitArriving, 'unitno'))== TRUE) { $unit7 = '7a'; };

为什么只有 [unitno] 的第二个实例创建它的结果?由于它们是独立的 array_search 条件,我期待 unit1 和 unit3 的结果。

我是否应该以不同的方式进行搜索和分配作为最佳做法?

编辑:添加对与遇到的问题相关的Identical vs Equal 运算符的引用。

编辑 2:将比较引入到其他数组时,原始逻辑似乎失败了。最初,我们查看是否有客人到达(数组:$mapHitArriving - 结果:单元 id 与 'a' 结合)。然后我们看看谁在离开(数组:$mapHitDeparting - 结果:'1d'),最后谁既不是到达也不是离开,哪个是留下(数组:$mapHitStaying - 结果:没有合并的字母,只有单位 id)。似乎第一个条件评估为 TRUE,因此其他条件无法执行。当初始数组有一些结果时,这种情况不存在,所以我相信即使为空(?)我也需要声明数组:

if(array_search(1,array_column($mapHitArriving, 'unitno'))!== FALSE) { $unit1 = '1a'; }
elseif (array_search(1,array_column($mapHitDeparting,'unitno'))!== FALSE) { $unit1 = '1d'; }
elseif (array_search(1,array_column($mapHitStaying,'unitno'))!== FALSE) { $unit1 = '1'; }

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    阅读手册,尤其是https://www.php.net/manual/en/function.array-search.php#refsect1-function.array-search-returnvalues

    查看:

    警告 此函数可能返回布尔值 false,但也可能返回非布尔值,其计算结果为 false

    array_search(1,array_column($mapHitArriving, 'unitno')) 返回什么?它返回0。这绝对是不是true

    将您的支票修改为:

    if(array_search(1,array_column($mapHitArriving, 'unitno')) !== false) { $unit1 = '1a'; };
    if(array_search(2,array_column($mapHitArriving, 'unitno')) !== false) { $unit2 = '2a'; };
    // etc 
    

    作为旁注,我建议将类似的数据存储为数组,而不是变量。你可以这样做:

    $unitnoKeys = array_map(
        function($v) { return $v . 'a'; }, 
        array_column($mapHitArriving, 'unitno')
    );
    $unitnos = array_fill_keys($unitnoKeys, true);
    print_r($unitnos);
    // outputs
    Array
    (
        [1a] => 1
        [3a] => 1
    )
    // after that you can chek whether you have a certain key 
    if (isset($unitnos['1a'])) {
        // do stuff
    }
    if (isset($unitnos['5a'])) {
        // do other stuff
    }
    

    【讨论】:

    【解决方案2】:

    @u_mulder 几乎已经回答了这个问题。不过,还有几点需要说明...

    原来的问题

    正如@u_mulder 已经说过的:你的代码工作正常;问题是,对于第一个实例,您的array_search(array_column()) 条件返回0,这相当于使用== 时的FALSE

    这是我与@u_nudler 不同的第一点。

    它返回0 的原因是因为array_column 在数字上重新索引了返回的结果。在您的情况下,它将返回:

    array(
        0 => 1,
        1 => 3
    );
    

    这意味着您的 array_search 与您的第一个 if 语句中的 0 => 1 匹配,然后计算表达式:

    (0 == TRUE) => FALSE
    

    注意

    这与原始键或array_search 函数无关。

    基本修复

    有几种方法可以解决这个问题:

    1. 使用!== FALSE 而不是== TRUE

      if( array_search(array_colum()) !== FALSE )
      
    2. 使用is_int() 而不是== TRUE

      if( is_int(array_search(array_column())) )
      
    3. 改为在您的 id 字段上索引 array_column

      array_column($mapHitArriving, 'unitno', 'id')
      

    补充一点

    以这种方式将值分配给变量意味着某些变量不会被分配。因此,当您开始使用它们时,您需要进行额外的检查以确保变量已被启动。如果你不这样做,那么 PHP 将引发 Notices: 不是大问题,但最好避免。

    更改代码

    虽然上述方法将在短期内解决问题。以这种方式构建代码并不是一个好习惯。

    您最好将相关数据简单地存储在一个数组中。您可以简单地使用 array_column 生成它!

    $units_arriving = array_column($mapHitArriving, 'unitno');
    

    将值存储在数组中还意味着您可以轻松地使用循环来处理值,例如:

    foreach($units_arriving as $unit){
        echo "Unit {$unit} is arriving today!\n";
    }
    

    这会大大减少您的代码如果没有循环,您的代码可能看起来像:

    echo "Unit {$unit1} is arriving today!\n";
    echo "Unit {$unit2} is arriving today!\n";
    echo "Unit {$unit3} is arriving today!\n";
    echo "Unit {$unit4} is arriving today!\n";
    echo "Unit {$unit5} is arriving today!\n";
    echo "Unit {$unit6} is arriving today!\n";
    echo "Unit {$unit7} is arriving today!\n";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-10
      • 2020-03-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 2011-08-01
      • 2014-12-22
      • 1970-01-01
      相关资源
      最近更新 更多