1

私はこの文字列を持っています(これは例のみです):

$string='cat-cat.png-0,dog-dog.jpg-0,phone-nokia.png-1,horse-xyz.png-0';

そして、この文字列を作り直すコード

$string=explode(",", $string);
$i = 0;
$ile=count($string);
while ($i < $ile) {
    $a = explode("-", $string[$i]);
    if($a[2]==0) $animal .= $a[0].' '.$a[1];
    elseif($a[2]==1) $thing .= $a[0].' '.$a[1];
    $i++;
}

この配列を検索して、次のようにグループ化する必要があります。$animalと$thingこのコードが機能しない理由はわかっていますが、これを行う考えはありません。お願い助けて :)

4

5 に答える 5

1

あなたが試すことができます

$string = 'cat-cat.png-0,dog-dog.jpg-0,phone-nokia.png-1,horse-xyz.png-0';
$array = explode(",", $string);
$list = array();

foreach ( $array as $info ) {
    list($prifix, $name, $id) = explode("-", $info);
    $list[$id][] = $prifix . "-" . $name;
}

var_dump($list);

出力

array
  0 => 
    array
      0 => string 'cat-cat.png' (length=11)
      1 => string 'dog-dog.jpg' (length=11)
      2 => string 'horse-xyz.png' (length=13)
  1 => 
    array
      0 => string 'phone-nokia.png' (length=15)
于 2012-10-05T14:06:43.590 に答える
0

preg_matchイメージ名に余分な文字-や数字などの他の文字が含まれている場合は、次の例を使用してそれを実現することもできます。

$string = 'cat-cat.png-0,dog-snoopy-dog.jpg-0,phone-nokia-6310.png-1,rabbit-bugs-bunny-eating-carrot.png-0,ignore-me';

$tmp = explode(',', $string);

$animals = $things = array();

foreach($tmp as $value)
{
    preg_match('/(?P<name>[A-Za-z]+)-(?P<file>[A-Za-z0-9\.-]+)-(?P<number>\d+)/', $value, $matches);

    if($matches)
    {
        switch($matches['number'])
        {
            case '0':
                array_push($animals, sprintf('%s %s', $matches['name'], $matches['file']));
                break;
            case '1':
                array_push($things, sprintf('%s %s', $matches['name'], $matches['file']));
                break;
        }
    }
}

結果:

array (size=3)
  0 => string 'cat cat.png' (length=11)
  1 => string 'dog snoopy-dog.jpg' (length=18)
  2 => string 'rabbit bugs-bunny-eating-carrot.png' (length=35)
array (size=1)
  0 => string 'phone nokia-6310.png' (length=20)
于 2012-10-05T14:08:51.610 に答える
0

これで次のタスクが完了します。

$string = 'cat-cat.png-0,dog-dog.jpg-0,phone-nokia.png-1,horse-xyz.png-0';
$array  = explode(',', $string);
$animal = array();
$thing  = array();
foreach ($array as $item)
{
    $a = explode('-', $item);
    if( $a[2] == 1 )
    {
        $thing[] = $a[0] . ' ' . $a[1];
    }
    else
    {
        $animal[] = $a[0] . ' ' . $a[1];
    }
}

次に、それらの配列を文字列として必要な場合は、そこから内破できます。

于 2012-10-05T13:34:59.933 に答える
0

コードが出力するもの、または達成したい結果の配列の例を示すと役立つ場合があります。

入力文字列形式に完全にこだわっている場合は、正規表現を使用してこれをもう少し堅牢にすることができます。何かのようなもの:

/([^,]*)-(\d+)/

タイプが常に数字であると仮定すると、ファイル名とタイプが一致します。

たとえば、次のようになります。

preg_match_all("/([^,]*)-(\d+)/", "cat-cat.png-0,dog-dog.jpg-0,phone-nokia.png-1,horse-xyz.png-0", $matches); var_dump($matches);
$items = array();
foreach ($matches[2] as $key=>$type) {
    if (empty($items[$type])) {
        $items[$type] = array();
    }
    $items[$type][] = $matches[1][$key];
}
var_dump($items);

理想的には、一致が期待どおりに返されるかどうかのチェックなど、さらにエラー チェックを追加する必要があります。

于 2012-10-05T13:36:25.343 に答える
0

以下のコードを試してください

// Remove all things and all numbers with preceding hyphens
$animal = trim(preg_replace('/([a-zA-Z\-\.]+\-1,?)|(\-\d+)/', '', $string), ',');
// gives 'cat-cat.png,dog-dog.jpg,horse-xyz.png'

// Remove all animals and all numbers with preceding hyphens
$thing = trim(preg_replace('/([a-zA-Z\-\.]+\-0,?)|(\-\d+)/', '', $string), ',');
// gives 'phone-nokia.png'
于 2012-10-05T14:14:00.273 に答える