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

时间:2015-10-17 12:41:26

标签: php arrays sorting csv

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

我有一个数组,$ 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
    
  3. 有人能引导我朝着正确的方向前进吗?

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

(function (angular) {
    'use strict';
    angular
        .module('application')
        .factory('CommunicationService',
            [
                '$http',
                CommunicationService
            ]
        );
})(angular);

输出:

$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);

答案 2 :(得分:0)

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

答案 3 :(得分:0)

$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>';