1

I have an php array like below:

Array ( 
[0] => Array ( [value] => 5 [label] => Akon )
[1] => Array ( [value] => 6 [label] => Angel ) 
[2] => Array ( [value] => 7 [label] => Britny ) 
[3] => Array ( [value] => 9 [label] => Mark Anthony ) 
[4] => Array ( [value] => 8 [label] => Michel ) 
[5] => Array ( [value] => 4 [label] => Shaggy ) 
[6] => Array ( [value] => 3 [label] => Smith ) 
) 

I need this array sort by specific letter. For example, if I sort by this "M" letter array should look like below.

Array ( 
[3] => Array ( [value] => 9 [label] => Mark Anthony ) 
[4] => Array ( [value] => 8 [label] => Michel ) 
[6] => Array ( [value] => 3 [label] => Smith ) 
[0] => Array ( [value] => 5 [label] => Akon ) 
[1] => Array ( [value] => 6 [label] => Angel ) 
[2] => Array ( [value] => 7 [label] => Britny ) 
[5] => Array ( [value] => 4 [label] => Shaggy ) 
) 

The begging letter should comes to first of array.(here begin with m) I greatly appreciated your any kind of help. Thank you very much...

6 Answers 6

7

Your comparison logic is going to be like this:

  • if two strings A and B start with the same letter, compare them as usual
  • if A starts with 'M', A wins
  • if B starts with 'M', B wins
  • otherwise, compare as usual

in code

$strings = array('Foo', 'Moo', 'Xuux', 'Me', 'Blah', 'Ma');
$letter = 'M';

usort($strings, function($a, $b) use($letter) {
    if($a[0] != $b[0]) {
        if($a[0] == $letter) return -1;
        if($b[0] == $letter) return +1;
    }
    return strcmp($a, $b);  
});

print_r($strings);
Sign up to request clarification or add additional context in comments.

Comments

1
class Cmp {
    public $letter;

    function __construct( $letter ) { $this->letter = $letter; }

    function doCmp( $a, $b ) {
        if( $a['label'][0] == $this->letter ) {
            if( $b['label'][0] != $this->letter ) return -1;
        } else {
            if( $b['label'][0] == $this->letter ) return 1;
        }
        return $a['label'] > $b['label'] ? 1 : -1;
    }
}

usort( $arr, array( new Cmp( 'M' ),  'doCmp' ) );

Comments

1
$strings = array ( 
    array ( 'value' => 5, 'label' => 'Akon' ),
    array ( 'value' => 6, 'label' => 'Angel' ), 
    array ( 'value' => 7, 'label' => 'Britny' ), 
    array ( 'value' => 9, 'label' => 'Mark Anthony' ) ,
    array ( 'value' => 8, 'label' => 'Michel' ) ,
    array ( 'value' => 4, 'label' => 'Shaggy' ) ,
    array ( 'value' => 3, 'label' => 'Smith' ) 
) ;

var_dump($strings);


$letter = 'm';
usort ($strings, function ($left, $right) {
    return ((($posLeft = strpos(strtolower($left['label']), 'm')) === false)
                       ? PHP_INT_MAX
                       : $posLeft)
         - ((($posRight = strpos(strtolower($right['label']), 'm')) === false) 
                       ? PHP_INT_MAX 
                       : $posRight);
});
var_dump($strings);

Just compares the position of the letter within the two strings. If the letter is not within one of the strings (strpos() returns false), it assumes an "infinite" index (PHP_INT_MAX),

Comments

0

this is an example i found on php.net that could help you and maintain the index : http://www.php.net/manual/en/function.sort.php#99419

Comments

0

Sort the data by the value based on the comparison reflecting the letter (Demo):

<?php

# the data
$data = array(
  0 => array(
    'value' => 5,
    'label' => 'Akon',
  ),
  1 => array(
    'value' => 6,
    'label' => 'Angel',
  ),
  2 => array(
    'value' => 7,
    'label' => 'Britny',
  ),
  3 => array(
    'value' => 9,
    'label' => 'Mark Anthony',
  ),
  4 => array(
    'value' => 8,
    'label' => 'Michel',
  ),
  5 => array(
    'value' => 4,
    'label' => 'Shaggy',
  ),
  6 => array(
    'value' => 3,
    'label' => 'Smith',
  ),
);

# the letter
$letter = 'M';

# the value to compare against
$value = function(array $a)
{
  $key = 'label';
  if (!array_key_exists($key, $a))
  {
     throw new InvalidArgumentException(sprintf('Key "%s" missing.', $key));
  }
  return $a[$key];
};

# the comparison
$compare = function($a, $b) use ($letter, $value) 
{
  $a = $value($a);
  $b = $value($b);
  if($a[0] != $b[0]) {
    if($a[0] === $letter) return -1;
    if($b[0] === $letter) return +1;
  }
  return strcmp($a, $b);  
};

# the sort
$sort = function() use ($data, $compare)
{
  $r = uasort($data, $compare);
  if (!$r)
  {
    throw new RuntimeException('Sort failed.');
  }
  return $data;
};

print_r($sort());

Comments

-1

Use usort to sort by a function. The function can contain any logic you want to put in, as long as the return value indicates sort order (see link for details).

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.