如何在 PHP 中使用逗号分隔的字符串对数组进行排序


How do I sort an Array with comma separated strings in PHP?

这是我在这里的第一篇文章,我是一个初学者,我希望你能对我放轻松。我搜索了一个答案,并阅读了一些半相关的问题。我已经坚持了几天了,我真的很困惑。抱歉,如果双管是失礼,将其写成两个单独的问题似乎不太明智。我是编程新手,直到昨天我才听说过这个网站,我希望能成为一个很棒的社区的贡献者。

我有一个数组,$newarray:

Array
(
    [2] => string1,10
    [7] => string2,15
    [10] => string3,3
    [11] => string4,7
)

我可以将其写入CSV文件,到目前为止一切顺利:

<?php
    $file = fopen("/myfile.csv","w");
    foreach ($newarray as $line)
      {
        fputcsv($file,explode(',',$line));
      }
    fclose($file);
?>

但是,我正在尝试做两件事。

  1. 在写入 CSV 之前按数值的相反顺序对数组进行排序,所以我会有一个 CSV 文件:

    string2,15
    string1,10
    string4,7
    string3,3
    
  2. 创建第二个文件(在写入第一个 CSV 之后(,其中的数值被剥离,如下所示:

    string2
    string1
    string4
    string3
    

有人能引导我走向正确的方向吗?

$arraybase = array(
    2 => 'string1,10',
    7 => 'string2,15',
    10 => 'string3,3',
    11 => 'string4,7',
);
function mapping($data){
    $array1 = array();//for first csv
    array_walk($data,function($value,$key)use(&$array1){
        $k=explode(',',$value);
        $array1[$k[1]] = $value;
    });
    krsort($array1);
    $array2 = array_map(function($value){//for second csv
        return preg_replace('/,'d+$/','',$value);
    },$array1);
    return array("csv1"=>$array1,"csv2"=>$array2);
}
$result = mapping($arraybase);
print('<pre>');print_r($result);

输出:

Array
(
    [csv1] => Array
        (
            [15] => string2,15
            [10] => string1,10
            [7] => string4,7
            [3] => string3,3
        )
    [csv2] => Array
        (
            [15] => string2
            [10] => string1
            [7] => string4
            [3] => string3
        )
)

您的$newArray必须具有串联的值吗?如果没有,最好将它们作为子数组:

$newArray = array (
    2 => array(
        0 => 'string1',
        1 => 10,
    ),
    7 => array(
        0 => 'string2',
        1 => 15,
    ),
    10 => array(
        0 => 'string3',
        1 => 3,
    ),
    11 => array(
        0 => 'string4',
        1 => 7,
    ),
);

然后您可以使用array_multisort进行排序:

$strings = array();
$numbers = array();
foreach ($newArray as $key => $row) {
    $strings[$key]  = $row[0];
    $numbers[$key] = $row[1];
}
array_multisort($numbers, SORT_DESC, $strings, SORT_ASC, $newArray);

当您写入 CSV 时:

<?php
    $file = fopen("/myfile.csv","w");
    foreach ($newArray as $line) {
        fputcsv($file, $line); // No need to explode as your data ia already in an array
    }
    fclose($file);
?>

要写入仅包含字符串的第二个 CSV,请执行以下操作:

<?php
    reset($newArray); // Sets the pointer in the array back to the beginning so it can be looped over again
    $file = fopen("/myfile2.csv","w");
    foreach ($newArray as $line) {
        fputcsv($file, $line[0]);
    }
    fclose($file);
?>

对于您的第一个问题,请尝试 http://php.net/manual/en/function.rsort.php 并在拍摄时给出它:)

$a=array(/* Original array */
    2   =>  'string1,10',
    7   =>  'string2,15',
    10  =>  'string4,3',
    11  =>  'string4,7'
);      
$c=array();
foreach( $a as $index => $value ){
    list($s,$i)=explode(',', $value );
    $c[$i]=$value;
}
/* Sort in reverse order */
krsort($c);
/* The value of $c is then written to your csv */
/* callback function to get the string */
function cb(&$item,$key){
    list( $s,$i )=explode(',',$item );
    $item=$s;
}
array_walk( $c, 'cb' );
echo '<pre>',print_r($b,true),'</pre>';