2012-02-16 3 views
1

Это может быть решено с помощью array_slice, если пары k/v были в предсказуемом месте, , к сожалению, они были разбросаны случайным образом по всему массиву, и мне нужно создать свою собственную глупую маленький метод переназначения вещей. К сожалению, мой цикл while здесь не отменяет приседания ... Есть (конечно, есть) лучший метод или способ исправить это поведение?PHP переназначение и удаление разделов из массива

Петля для переназначения и вставки в черный список.

  $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

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

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

не получит то, что вам нужно, и то, что ваша проблема – dynamic

+0

просьбы уточнить – JKirchartz

+0

ли действительно содержит ключ отчеты массив кавычку? Тьфу! –

ответ

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' => '', 
) 
0

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

reset($reports); 

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

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

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