2016-03-15 3 views
-1

Используя этот PHP код:PHP - Перестановка многомерный массив значение стать ключом

function parseCSV($csvfile) { 
     $csv = array(); 
     $rowcount = 0; 
     if (($handle = fopen($csvfile, "r")) !== FALSE) { 
      $max_line_length = defined('MAX_LINE_LENGTH') ? MAX_LINE_LENGTH : 10000; 
      $header = fgetcsv($handle, $max_line_length); 
      $header_colcount = count($header); 
      while (($row = fgetcsv($handle, $max_line_length)) !== FALSE) { 
       $row_colcount = count($row); 
       if ($row_colcount == $header_colcount) { 
        $entry = array_combine($header, $row); 
        $csv[] = $entry; 
       } 
       else { 
        error_log("csvreader: Invalid number of columns at line " . ($rowcount + 2) . " (row " . ($rowcount + 1) . "). Expected=$header_colcount Got=$row_colcount"); 
        return null; 
       } 
       $rowcount++; 
      } 
      fclose($handle); 
     } 
     else { 
      error_log("csvreader: Could not read CSV \"$csvfile\""); 
      return null; 
     } 

     return $csv; 
    } 

для синтаксического анализа CSV и получить эти значения, что действительно хорошо:

array(2) { 
    [0]=> 
    array(6) { 
    ["keyword"]=> 
    string(7) "TEST" 
    ["tag1"]=> 
    string(5) "TEST1" 
    ["tag2"]=> 
    string(5) "TEST2" 
    ["tag3"]=> 
    string(5) "TEST3" 
    ["tag4"]=> 
    string(5) "TEST4" 
    ["tag5"]=> 
    string(5) "TEST5" 
    } 
    [1]=> 
    array(6) { 
    ["keyword"]=> 
    string(9) "BadCredit" 
    ["tag1"]=> 
    string(7) "Credit1" 
    ["tag2"]=> 
    string(7) "Credit2" 
    ["tag3"]=> 
    string(7) "Credit3" 
    ["tag4"]=> 
    string(7) "Credit4" 
    ["tag5"]=> 
    string(7) "Credit5" 
    } 
} 

Теперь мне нужно в секунду часть моего кода, чтобы изменить порядок, что значение loook так:

array(2) { 
    ["TEST"]=> 
    array(5) { 
    ["tag1"]=> 
    string(5) "TEST1" 
    ["tag2"]=> 
    string(5) "TEST2" 
    ["tag3"]=> 
    string(5) "TEST3" 
    ["tag4"]=> 
    string(5) "TEST4" 
    ["tag5"]=> 
    string(5) "TEST5" 
    } 
    ["BadCredit"]=> 
    array(5) { 
    ["tag1"]=> 
    string(7) "Credit1" 
    ["tag2"]=> 
    string(7) "Credit2" 
    ["tag3"]=> 
    string(7) "Credit3" 
    ["tag4"]=> 
    string(7) "Credit4" 
    ["tag5"]=> 
    string(7) "Credit5" 
    } 
} 

Мне нужно получить «ключевое слово» значение и место, как ключ для массив для пены может создавать объекты для другой части кода. Как это сделать?

ответ

1

Использование array_reduce функции:

// $array with values 

$newArray = array_reduce($array, function($carry, $item) { 
    $keyword = $item['keyword']; 
    unset($item['keyword']); 
    $carry[$keyword] = $item; 
    return $carry; 
}, array()); 

Например попробовать код ниже:

// sample code 

$array = array(
    array(
     "keyword"=> "TEST", 
     "tag1"=>"TEST1" 
), 
    array(
     "keyword" => "BadCredit", 
     "tag1"=> "Credit1" 
    ) 
); 


$newArray = array_reduce($array, function($carry, $item) { 
    $keyword = $item['keyword']; 
    unset($item['keyword']); 
    $carry[$keyword] = $item; 
    return $carry; 
}, array()); 

выход будет:

array(2) { 
    ["TEST"]=> 
    array(1) { 
    ["tag1"]=> 
    string(5) "TEST1" 
    } 
    ["BadCredit"]=> 
    array(1) { 
    ["tag1"]=> 
    string(7) "Credit1" 
    } 
} 
+0

Хорошая точка. Это почти правильное решение, но это плохо. Вот где я складываюсь, я получаю подобное решение, но смотрю выше в своем вопросе, как нужно искать. Мне нужно, чтобы ключевые слова стали ключами. –

+0

ОК, я должен быть более осторожным :) Просто используйте 'array_reduce' вместо' array_map' –

+0

Спасибо, человек, вот и все. Я был потерян! –

2

Это должно сделать это.

foreach ($csv as $item) { 
    $new_array[$item['keyword']] = array_diff_key($item, ['keyword' => 0]); 
} 

array_diff_key удалит ключевое слово из каждого элемента перед добавлением его в новый массив, используя keyword в качестве ключа.

+0

Это тоже хороший ответ. Благодаря! –

+0

Добро пожаловать. Я думаю, что обычно есть несколько способов сделать что-то. :) –

+0

Totaly, я буду использовать ваше решение, потому что он чище. –

Смежные вопросы