PHP переназначение и удаление разделов из массива - PullRequest
1 голос
/ 17 февраля 2012

Это можно решить с помощью array_slice, если пары k / v были в предсказуемом месте, к сожалению, они были случайно разбросаны по всему массиву, и я должен создать свой собственный маленький глупый метод, чтобы переназначить вещи. К сожалению, мой цикл 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`' => '\'\'',
)

EDIT

Итак, как вы можете видеть, второй массив STILL содержит ключи, которые находятся в первом массиве, они не сбрасываются. Даже если я сделаю несколько циклов рекурсии, как это

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

Ответы [ 2 ]

0 голосов
/ 17 февраля 2012

array_diff_assoc дал мне нужные мне результаты

<code>$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 '
';перерыв;массив ('shipper' => '', 'status' => '', 'po' => '', 'inspector' => '', 'commodity' => '', 'count' => '','size' => '', 'label' => '','iety '=>' ',' pack_date '=>' ',' comments '=>' ',' report_key '=>' ',' type'=>' melons ',' staged '=>' true ',) array (' inspe_number '=>' ',' customer_number '=>' ',' customer_division '=>' ',' report_date '=>' 1969-12-31 ',' customer '=>' ',' location '=>' ',' region '=>' ',)
0 голосов
/ 17 февраля 2012

Возможно, потому что ваш курсор чтения для рассматриваемого массива находится в конце массива, вы можете использовать:

reset($reports);

перед запуском вашего цикла, хотя я бы посоветовал использовать:

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

Это немного элегантнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...