【问题标题】:PHP - Looping through a mixed arrayPHP - 通过混合数组循环
【发布时间】:2015-04-06 01:17:27
【问题描述】:

假设我有两个数组,一个是我需要的键,另一个是我要测试的数组。

在我需要的键数组中,每个键可能有一个值,该值本身就是我需要的键数组,依此类推。

目前的功能如下:

static function keys_exist_in_array(Array $required_keys, Array $values_array, &$error)
{       
    foreach($required_keys as $key)
    {
        //  Check required key is set in the values array
        //          
        if (! isset($values_array[$key]))
        {
            //  Required key is not set in the values array, set error and return
            //
            $error = new Error();

            return false;
        }

        //  Check the value is an array and perform function on its elements
        //
        if (is_array($values_array[$key]))
        {
            Static::keys_exist_in_array($required_keys[$key], $values_array[$key], $error);
        }

        return true;
    }
}

我的问题是我要提交给$required_keys CAN 的数组如下所示:

$required_keys = array(
    ‘key1’,
    ‘key2’,
    ‘key3’,
    ‘key4’ = array(
        ‘key1’,
        ‘key2’,
        ‘key3’ = array(
            ‘key1’
        )
    )
);

显然这里的问题是foreach 只能找到每个键,例如'key4',而不是没有自己值的值,例如‘key1’,‘key2’,‘key3’。

但如果我使用标准 for 循环进行循环,我只会得到值 key1、key2、key3。

有什么更好的方法?

谢谢

【问题讨论】:

  • 循环时检查值是否为数组,如果是则在循环内再次调用函数并传递值(数组)。
  • 检查元素的类型,如果是数组,则在该元素上递归!
  • 如上所述,问题在于循环。 Foreach 只提供键,for 只提供值。我需要在一个循环中...第 18-21 行是递归函数
  • 为什么两者都需要? key1key2等都是值。你的数组很奇怪:为什么它是索引数组和关联数组的混合体?

标签: php arrays


【解决方案1】:

几个问题:

$key是数组的元素,不是key,所以你

你不应该在看到不匹配的元素时立即return false,因为后面的数组中可能会有匹配的元素。相反,您应该在找到匹配项后立即return true。找到匹配项后,您无需继续搜索。

您需要先进行isarray() 测试,因为如果$key 是一个数组并且您尝试使用$values_array[$key],您将收到错误消息。它应该是isarray($key),而不是isarray($values_array[$key])

您需要测试递归调用的值。如果成功,您可以立即返回。

你应该只在你完成循环并且没有找到任何东西之后return false

static function keys_exist_in_array(Array $required_keys, Array $values_array, &$error)
{       
    foreach($required_keys as $key)
    {
        //  Check the value is an array and perform function on its elements
        //
        if (is_array($key))
        {
            $result = Static::keys_exist_in_array($required_keys[$key], $values_array[$key], $error);
            if ($result) {
                return true;
            }
        }            
        //  Check required key is set in the values array
        //          
        elseif (isset($values_array[$key]))
        {
            return true;
        }
    }
    $error = new Error();
    return false;
}

【讨论】:

    【解决方案2】:

    如果您要求所有 $required_keys 都存在,则在此处返回 false 是正确的操作,因为您希望它在找到丢失的密钥后立即停止查找。

    static function keys_exist_in_array(Array $required_keys, Array $values_array, &$error)
    {       
        foreach($required_keys as $key=>$value)
        {
            //check if this value is an array
            if (is_array($value))
            {
                if (!array_key_exists($key, $values_array) 
                    || !Static::keys_exist_in_array($value, $values_array[$key], $error);){
                    $error = new Error();
                    return false;
                }
    
    
            }
    
            //  Since this value is not an array, it actually represents a 
            //   key we need in the values array, so check if it is set 
            //   in the values array    
            elseif (!array_key_exists($value, $values_array))
            {
                //  Required key is not set in the values array, set error and return
                $error = new Error();
                return false;
            }
    
    
        }
        //All elements have been found, return true
        return true;
    }
    

    【讨论】:

      【解决方案3】:

      将数组转换为 key => value 数组,对于没有值的“键”,该数组具有空值。

      $arr = [
          'a',
          'b' => ['foo' => 1, 'bar' => 'X'],
          'c' => ['baz' => 'Z'],
          'd'
      ];
      
      $res = [];
      $keys = array_keys($arr);
      $vals = array_values($arr);
      foreach ($vals as $i => $v) {
          if (is_array($v)) {
              $res[$keys[$i]] = $v;
          } else {
              $res[$v] = [];
          }
      }
      
      print_r($res);
      

      结果:

      Array
      (
          [a] => Array
              (
              )
      
          [b] => Array
              (
                  [foo] => 1
                  [bar] => X
              )
      
          [c] => Array
              (
                  [baz] => Z
              )
      
          [d] => Array
              (
              )
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-19
        • 1970-01-01
        • 1970-01-01
        • 2014-06-11
        • 2015-09-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多