繁体   English   中英

如何在 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

有人可以引导我朝着正确的方向前进吗?

你的 $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);
?>
$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
        )

)

对于您的第一个问题,请尝试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>';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM