我已经解析了三个不同的文本文件:
space.txt
Kournikova Anna F F 6-3-1975 Red
Hingis Martina M F 4-2-1979 Green
Seles Monica H F 12-2-197
comma.txt
Abercrombie, Neil, Male, Tan, 2/13/1943
Bishop, Timothy, Male, Yellow, 4/23/1967
Kelly, Sue, Female, Pink, 7/12/1959
pipe.txt
Smith | Steve | D | M | Red | 3-3-1985
Bonk | Radek | S | M | Green | 6-3-1975
Bouillon | Francis | G | M | Blue | 6-3-1975
我使用以下代码将所有文件解析为一个数组.............
<?php
$space_txt = './data/input/space.txt';
$comma_txt = './data/input/comma.txt';
$pipe_txt = './data/input/pipe.txt';
$parsed_space_data = file_get_contents($space_txt);
$parsed_comma_data = file_get_contents($comma_txt);
$parsed_pipe_data = file_get_contents($pipe_txt);
$space_array = myExpldeLoopFunc("space"," ", $parsed_space_data);
$comma_array = myExpldeLoopFunc("comma",",", $parsed_comma_data);
$pipe_array = myExpldeLoopFunc("pipe"," | ", $parsed_pipe_data);
$finalArray = array_merge($space_array, $comma_array, $pipe_array);
function changeGender($gender) {
if($gender === 'F') {
return str_replace('F', 'Female', $gender);
}
elseif($gender === 'M') {
return str_replace('M', 'Male', $gender);
}
}
function normalizeDate($date) {
return str_replace('-', '/', $date);
}
function myExpldeLoopFunc($name, $sep, $data) {
$parsedData = explode("\r", $data);
$arr = [];
foreach ($parsedData as $data) {
$data_arr = explode($sep, $data);
if($name == 'space'){
$arr[] = [
"last_name" => $data_arr[0],
"first_name" => $data_arr[1],
// "middle_initial" => $data_arr[2],
"gender" => changeGender($data_arr[3]),
"date_of_birth" => normalizeDate($data_arr[4]),
"favorite_color" => $data_arr[5]
];
}
elseif($name == 'comma') {
$arr[] = [
"last_name" => $data_arr[0],
"first_name" => $data_arr[1],
"gender" => $data_arr[2],
"date_of_birth" => normalizeDate($data_arr[4]),
"favorite_color" => $data_arr[3]
];
}
elseif ($name == 'pipe') {
$arr[] = [
"last_name" => $data_arr[0],
"first_name" => $data_arr[1],
// "middle_initial" => $data_arr[2],
"gender" => changeGender($data_arr[3]),
"date_of_birth" => normalizeDate($data_arr[5]),
"favorite_color" => $data_arr[4]
];
}
}
return $arr;
}
for ($i=0; $i < count($finalArray); $i++) {
foreach ($finalArray as $key => $row) {
$gender[$key] = $row['gender'];
$last_name[$key] = $row['last_name'];
}
array_multisort($gender, SORT_ASC, $last_name, SORT_ASC, $finalArray);
echo join(' ', $finalArray[$i]) . '<br>';
}
var_dump($finalArray);
?>
现在我有以下数组...........
array (size=9)
0 =>
array (size=5)
'last_name' => string 'Kournikova' (length=10)
'first_name' => string 'Anna' (length=4)
'gender' => string 'Female' (length=6)
'date_of_birth' => string '6/3/1975' (length=8)
'favorite_color' => string 'Red' (length=3)
1 =>
array (size=5)
'last_name' => string '
Hingis' (length=7)
'first_name' => string 'Martina' (length=7)
'gender' => string 'Female' (length=6)
'date_of_birth' => string '4/2/1979' (length=8)
'favorite_color' => string 'Green' (length=5)
2 =>
array (size=5)
'last_name' => string '
Seles' (length=6)
'first_name' => string 'Monica' (length=6)
'gender' => string 'Female' (length=6)
'date_of_birth' => string '12/2/1973' (length=9)
'favorite_color' => string 'Black' (length=5)
3 =>
array (size=5)
'last_name' => string 'Abercrombie' (length=11)
'first_name' => string ' Neil' (length=5)
'gender' => string ' Male' (length=5)
'date_of_birth' => string ' 2/13/1943' (length=10)
'favorite_color' => string ' Tan' (length=4)
4 =>
array (size=5)
'last_name' => string '
Bishop' (length=7)
'first_name' => string ' Timothy' (length=8)
'gender' => string ' Male' (length=5)
'date_of_birth' => string ' 4/23/1967' (length=10)
'favorite_color' => string ' Yellow' (length=7)
5 =>
array (size=5)
'last_name' => string '
Kelly' (length=6)
'first_name' => string ' Sue' (length=4)
'gender' => string ' Female' (length=7)
'date_of_birth' => string ' 7/12/1959' (length=10)
'favorite_color' => string ' Pink' (length=5)
6 =>
array (size=5)
'last_name' => string 'Smith' (length=5)
'first_name' => string 'Steve' (length=5)
'gender' => string 'Male' (length=4)
'date_of_birth' => string '3/3/1985' (length=8)
'favorite_color' => string 'Red' (length=3)
7 =>
array (size=5)
'last_name' => string '
Bonk' (length=5)
'first_name' => string 'Radek' (length=5)
'gender' => string 'Male' (length=4)
'date_of_birth' => string '6/3/1975' (length=8)
'favorite_color' => string 'Green' (length=5)
8 =>
array (size=5)
'last_name' => string '
Bouillon' (length=9)
'first_name' => string 'Francis' (length=7)
'gender' => string 'Male' (length=4)
'date_of_birth' => string '6/3/1975' (length=8)
'favorite_color' => string '
Blue' (length=4)
到目前为止,输出是........
Kelly Sue Female 7/12/1959 Pink
Bishop Timothy Male 4/23/1967 Yellow
Abercrombie Neil Male 2/13/1943 Tan
Hingis Martina Female 4/2/1979 Green
Seles Monica Female 12/2/1973 Black
Kournikova Anna Female 6/3/1975 Red
Bonk Radek Male 6/3/1975 Green
Bouillon Francis Male 6/3/1975 Blue
Smith Steve Male 3/3/1985 Red
我想通过Females然后是Males对数组进行排序,然后通过last_name asc ........
对数组进行排序Hingis Martina Female 4/2/1979 Green
Kelly Sue Female 7/12/1959 Pink
Kournikova Anna Female 6/3/1975 Red
Seles Monica Female 12/2/1973 Black
Abercrombie Neil Male 2/13/1943 Tan
Bishop Timothy Male 4/23/1967 Yellow
Bonk Radek Male 6/3/1975 Green
Bouillon Francis Male 6/3/1975 Blue
Smith Steve Male 3/3/1985 Red
我也试过......
function sortBy($field, &$array, $direction = 'asc') {
usort($array, create_function('
$a, $b', ' $a = $a["' . $field . '"];
$b = $b["' . $field . '"];
if ($a == $b) {
return 0;
}
return ($a ' . ($direction == 'desc' ? '>' : '<') .' $b) ? -1 : 1; '));
return true;
}
for ($i=0; $i < count($finalArray); $i++) {
sortBy('gender', $finalArray);
sortBy('last_name', $finalArray);
echo join(' ', $finalArray[$i]) . '<br>';
}
我尝试过array_multisort(),usort(),sort(),asort(),但仍然无法产生我想要的结果。可以使用什么解决方案来产生结果?
答案 0 :(得分:1)
好的,我会给出一个例子,有两个标准,但是你的数据未经测试。所以下面的compare()
函数接收两个要比较的数组。怎么做?在示例中,每个数组包含两个数字,首先我们使用key = 0对数字进行排序,然后使用key = 1对数字进行排序。当然,您的密钥是不同的。
function compare($array1,$array2)
{
// numbers at key 0 are equal
if ($array1[0] == $array2[0])
{
// so we look at key 1.
if ($array1[1] == $array2[1]) return 0;
return ($array1[1] < $array2[1]) ? -1 : 1;
}
return ($array1[0] < $array2[0]) ? -1 : 1;
}
$a = [[1,2],[3,4],[5,4],[4,2],[1,8]];
usort($a,'compare');
foreach ($a as $key => $value)
{
echo "<pre>$key: ".print_r($value,TRUE)."\n</pre>";
}
您需要做的就是根据您的情况进行调整。
这会对数组中的两个值进行排序,就像你所说的那样,升序。如果您希望其中一个按降序排列,只需将<
更改为>
即可。此处使用的密钥为0
和1
,您的密钥类似于gender
和last_name
。
某些值无法与<
比较运算符进行比较,因此您需要使用其他值。如果是last_name
,您可能需要使用strcasecmp()
。
答案 1 :(得分:0)
代码中的主要问题:
\r
分割:最好按\n
分割,适用于所有平台。但由于换行符可以是\r\n
,因此您还需要删除其他字符。您可以使用trim()
。所以我建议将trim()
应用于所有值。changeGender
函数看起来很奇怪。您可以使用以下内容完成所有操作:return $gender === 'F' ? 'Female' : 'Male'
。更正的代码(也很好地缩进)后跟我的评论标记为//**
:
$space_txt = './data/input/space.txt';
$comma_txt = './data/input/comma.txt';
$pipe_txt = './data/input/pipe.txt';
$parsed_space_data = file_get_contents($space_txt);
$parsed_comma_data = file_get_contents($comma_txt);
$parsed_pipe_data = file_get_contents($pipe_txt);
$space_array = myExpldeLoopFunc("space", " ", $parsed_space_data);
$comma_array = myExpldeLoopFunc("comma", ",", $parsed_comma_data);
$pipe_array = myExpldeLoopFunc("pipe", " | ", $parsed_pipe_data);
$finalArray = array_merge($space_array, $comma_array, $pipe_array);
function changeGender($gender) {
return $gender === 'F' ? 'Female' : 'Male'; //** This is more straightforward
}
function normalizeDate($date) {
return str_replace('-', '/', $date);
}
function myExpldeLoopFunc($name, $sep, $data) {
$parsedData = explode("\n", $data); //** use "\n" instead of "\r"
$arr = [];
foreach ($parsedData as $data) {
if ($data === "") continue; //** skip empty lines
$data_arr = explode($sep, $data);
if($name == 'space'){
$arr[] = [
"last_name" => trim($data_arr[0]), //** trim all elements (also removes "\r")
"first_name" => trim($data_arr[1]),
// "middle_initial" => trim($data_arr[2]),
"gender" => changeGender(trim($data_arr[3])),
"date_of_birth" => normalizeDate(trim($data_arr[4])),
"favorite_color" => trim($data_arr[5])
];
} elseif($name == 'comma') {
$arr[] = [
"last_name" => trim($data_arr[0]),
"first_name" => trim($data_arr[1]),
"gender" => trim($data_arr[2]),
"date_of_birth" => normalizeDate(trim($data_arr[4])),
"favorite_color" => trim($data_arr[3])
];
} elseif ($name == 'pipe') {
$arr[] = [
"last_name" => trim($data_arr[0]),
"first_name" => trim($data_arr[1]),
// "middle_initial" => trim($data_arr[2]),
"gender" => changeGender(trim($data_arr[3])),
"date_of_birth" => normalizeDate(trim($data_arr[5])),
"favorite_color" => trim($data_arr[4])
];
}
}
return $arr;
}
//** Removed the bad for-loop that appeared here.
foreach ($finalArray as $key => $row) {
$gender[$key] = $row['gender'];
$last_name[$key] = $row['last_name'];
}
array_multisort($gender, SORT_ASC, $last_name, SORT_ASC, $finalArray);
//** Output in a loop, but leave the above sorting out of it
foreach ($finalArray as $row) {
echo join(' ', $row) . "<br>\n";
}
print_r($finalArray);
在eval.in上查看它,它使用您提供的示例数据。
订单符合要求。