1

これは、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`' => '\'\'',
)

編集

ご覧のとおり、2番目の配列にはまだ最初の配列にあるキーが含まれています。これらは未設定ではありません。このように複数の再帰ループを実行しても

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; }
}
4

2 に答える 2

0

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' => '',
)
于 2012-02-16T21:56:56.727 に答える
0

おそらく、問題の配列の読み取りカーソルが配列の最後にあるため、次を使用できます。

reset($reports);

ループを実行する前に、次を使用することをお勧めします。

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

もう少しエレガントです。

于 2012-02-16T20:17:01.527 に答える