【问题标题】:PHP reassigning and removing sections from an arrayPHP从数组中重新分配和删除部分
【发布时间】:2012-03-08 06:27:03
【问题描述】:

如果 k/v 对位于可预测的位置,则可以使用 array_slice 解决此问题, 不幸的是,它们随机分散在整个阵列中,我必须 创建我自己的愚蠢的小方法来重新分配事物。不幸的是,我这里的 while 循环并没有取消蹲下....有(当然有)更好的方法,或者纠正这种行为的方法吗?

重新分配和将密钥列入黑名单的循环。

            $reports = array(
                  'inspection_number'   =>"{$array['report_key']}",
                  'customer_number'     =>"{$array['customer_number']}",
                  'customer_division'   =>"{$array['customer_division']}",
                  'report_date'         =>"{$array['report_date']}",
                  'customer'            =>"{$array['customer']}",
                  'location'            =>"{$array['location']}",
                  'region'              =>"{$array['region']}",
            );

            while (list($k, $v) = each($reports)) {
                if($array[$k]) { unset($array[$k], $array[$v]); }
            }

数组,你可以看到 $array 里面仍然有 $reports 键。

array (
  'shipper' => '',
  'status' => '',
  'po' => '',
  'location' => '',
  'inspector' => '',
  'commodity' => '',
  'count' => '',
  'size' => '',
  'label' => '',
  'variety' => '',
  'pack_date' => '',
  'comments' => '',
  'report_key' => '',
  'region' => '',
  'type' => 'melons',
  'report_date' => '1969-12-31',
  'customer_number' => '',
  'customer' => '',
  'customer_division' => '',
  'staged' => 'true',
)array (
  '`inspection_number`' => '\'\'',
  '`customer_number`' => '\'\'',
  '`customer_division`' => '\'\'',
  '`report_date`' => '\'1969-12-31\'',
  '`customer`' => '\'\'',
  '`location`' => '\'\'',
  '`region`' => '\'\'',
)

编辑

如您所见,第二个数组仍然包含第一个数组中的键, 这些并没有被取消。即使我像这样进行多重递归循环

foreach($reports as $reportsKey => $reportsValue) {
foreach($array as $arrayKey => &$arrayValue) {
    if($reportsKey == $arrayKey) { unset($arrayKey); }
} }

我正在尝试分配$reports 中的键,$array 中的键/值, 然后从$array 取消设置复制的密钥。这可以通过array_slice() 完成 如果$array 中键的位置是可预测的,但不幸的是它们 不是。

奇怪的是,即使尝试分配 $reports 中不存在的键也不起作用

$tmp = array();
foreach($array as $ak => $av) {
    // if $reports['key_name'] does not exist, assign it to a new array.
    if(!$reports[$ak]) { $tmp[$ak] = $av; }
}

【问题讨论】:

  • 没有得到你需要的东西,你的问题是什么
  • reports 数组键是否真的包含反引号?啊!
  • 反引号是临时为数据库插入做准备的

标签: php multidimensional-array while-loop unset


【解决方案1】:

可能是因为您对相关数组的读取光标位于数组的末尾,您可以使用:

reset($reports);

在运行循环之前,尽管我建议使用:

foreach($reports as $k => $v) {
   ...
}

它更优雅一点。

【讨论】:

    【解决方案2】:

    array_diff_assoc 给了我我需要的结果

    $reports = array(
          'inspection_number'   =>"{$array['report_key']}",
          'customer_number'     =>"{$array['customer_number']}",
          'customer_division'   =>"{$array['customer_division']}",
          'report_date'         =>"{$array['report_date']}",
          'customer'            =>"{$array['customer']}",
          'location'            =>"{$array['location']}",
          'region'              =>"{$array['region']}",
    );
    
    $array = array_diff_assoc($array, $reports);
    echo '<pre>'; var_export($array); var_export($reports); echo '</pre>'; break;
    
    array (
      'shipper' => '',
      'status' => '',
      'po' => '',
      'inspector' => '',
      'commodity' => '',
      'count' => '',
      'size' => '',
      'label' => '',
      'variety' => '',
      'pack_date' => '',
      'comments' => '',
      'report_key' => '',
      'type' => 'melons',
      'staged' => 'true',
    )
    
    array (
      'inspection_number' => '',
      'customer_number' => '',
      'customer_division' => '',
      'report_date' => '1969-12-31',
      'customer' => '',
      'location' => '',
      'region' => '',
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-26
      • 2014-02-15
      • 2015-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多